මම හිතන්නේ අනෙක් පිළිතුරු වලින් යමක් මග හැරී ඇත.
ඔව්, p[i]
අර්ථ දැක්වීම අනුව සමාන වේ *(p+i)
, (එකතු කිරීම සංක්රමණශීලී බැවින්) සමාන *(i+p)
වන අතර (නැවතත්, []
ක්රියාකරුගේ අර්ථ දැක්වීම අනුව ) සමාන වේ i[p]
.
(සහ දී array[i]
, අරාවෙහි නම ව්යංගයෙන් අරාවේ පළමු අංගයට දර්ශකයක් බවට පරිවර්තනය වේ.)
නමුත් එකතු කිරීමේ සංක්රමණශීලීත්වය මේ අවස්ථාවේ දී එතරම් පැහැදිලි නැත.
ඔපෙරන්ඩ් දෙකම එකම වර්ගයට අයත් වන විට හෝ පොදු වර්ගයකට උසස් කරන ලද විවිධ සංඛ්යාත්මක වර්ගවල පවා, සංක්රමණිකතාව පරිපූර්ණ අර්ථයක් ලබා දෙයි : x + y == y + x
.
නමුත් මේ අවස්ථාවේ දී අපි විශේෂයෙන් කතා කරන්නේ දර්ශක අංක ගණිතය ගැන ය, එහිදී එක් ඔපෙරන්ඩ් එකක් දර්ශකයක් වන අතර අනෙක පූර්ණ සංඛ්යාවක් වේ. (පූර්ණ සංඛ්යා + නිඛිලය වෙනස් මෙහෙයුමක් වන අතර, දර්ශකය + දර්ශකය විකාරයකි.)
සී ප්රමිතියේ +
ක්රියාකරු පිළිබඳ විස්තරය ( N1570 6.5.6) මෙසේ පවසයි:
මීට අමතරව, එක්කෝ ඔපෙරන්ඩ් දෙකටම අංක ගණිතමය වර්ගයක් තිබිය යුතුය, නැතහොත් එක් ඔපෙරන්ඩ් එකක් සම්පූර්ණ වස්තු වර්ගයක් සඳහා දර්ශකයක් විය යුතු අතර අනෙක පූර්ණ සංඛ්යා වර්ගය තිබිය යුතුය.
එය පහසුවෙන් පැවසිය හැකිය:
මීට අමතරව, එක්කෝ ඔපෙරන්ඩ් දෙකටම අංක ගණිතමය වර්ගයක් තිබිය යුතුය, නැතහොත් වම්
ඔපෙරන්ඩ් එක සම්පූර්ණ වස්තු වර්ගයක් සඳහා දර්ශකයක් විය යුතු අතර දකුණු ඔපෙරන්ඩ්හි
පූර්ණ සංඛ්යා වර්ගය තිබිය යුතුය.
එම අවස්ථා දෙකෙහිම i + p
සහ i[p]
නීති විරෝධී වනු ඇත.
C ++ පදයට අනුව, අපට ඇත්ත වශයෙන්ම අධි බර පැටවූ +
ක්රියාකරුවන් කට්ටල දෙකක් ඇත , ඒවා ලිහිල් ලෙස විස්තර කළ හැකිය:
pointer operator+(pointer p, integer i);
සහ
pointer operator+(integer i, pointer p);
ඒවායින් පළමුවැන්න පමණක් අවශ්ය වේ.
ඉතින් ඇයි මේ වගේ?
C ++ ට මෙම අර්ථ දැක්වීම C වෙතින් උරුම වූ අතර එය B වෙතින් ලබා ගන්නා ලදි (අරාව සුචිගත කිරීමේ සංක්රමණිකතාව 1972 පරිශීලකයින්ගේ B හි සඳහන් කර ඇත ), එය BCPL (1967 දිනැති අත්පොත) වෙතින් ලබා ගත් අතර එය බොහෝ විට එය පවා ලබාගෙන ඇත. පෙර භාෂා (සීපීඑල්? ඇල්ගොල්?).
එබැවින් අරාව සුචිගත කිරීම අර්ථ දැක්වෙන්නේ එකතු කිරීම අනුව වන අතර, එම එකතු කිරීම, දර්ශකයක් සහ පූර්ණ සංඛ්යාවක් පවා සංක්රමණික වේ යන අදහස දශක ගණනාවකට පෙර සී හි මුතුන් මිත්තන්ගේ භාෂාවලට දිව යයි.
එම භාෂාවන් නූතන සී වලට වඩා තදින් ටයිප් කර ඇත. විශේෂයෙන්, දර්ශක සහ නිඛිල අතර වෙනස බොහෝ විට නොසලකා හරින ලදි. (මුල් සී ක්රමලේඛකයින් සමහර විට unsigned
භාෂාවට මූලික පදය එක් කිරීමට පෙර අත්සන් නොකළ පූර්ණ සංඛ්යා ලෙස දර්ශක භාවිතා කළහ.) එබැවින් ඔපෙරන්ඩ්ස් විවිධ වර්ගවල බැවින් එකතු කිරීම සංක්රමණ නොවන බවට පත් කිරීමේ අදහස බොහෝ විට එම භාෂාවල නිර්මාණකරුවන්ට සිදු නොවනු ඇත. පරිශීලකයෙකුට "දේවල්" දෙකක් එකතු කිරීමට අවශ්ය නම්, එම "දේවල්" පූර්ණ සංඛ්යා, දර්ශක හෝ වෙනත් යමක් වේවා, එය වැළැක්වීම භාෂාවට අදාළ නොවේ.
වසර ගණනාවක් පුරා, එම රීතියේ යම් වෙනසක් සිදුවුවහොත් පවත්නා කේතය බිඳී යනු ඇත (1989 ANSI C ප්රමිතිය හොඳ අවස්ථාවක් විය හැකි වුවද).
C සහ / හෝ C ++ වෙනස් කිරීම මඟින් දර්ශකය වම් පසින් තැබීම සහ දකුණු පස ඇති නිඛිලය දැනට පවතින කේත කිහිපයක් බිඳ දැමිය හැකි නමුත් සැබෑ ප්රකාශන බලය නැති නොවේ.
ඒ නිසා අපට දැන් arr[3]
හා 3[arr]
හරියටම තේරුම එකම දෙයක්, අග ආකාරයක බාහිර කවදාවත් පෙනී යුතු වුවත් IOCCC .