ඇයි මට ++; මම--; එකිනෙකා පසුපස?


164

1997 දී නිකුත් කරන ලද nmap සඳහා වන ප්‍රභව කේතය දෙස මම බලා සිටියෙමි. මෙම කේතයේ කොටස මට ටිකක් අමුතු ලෙස පෙනේ:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++;                                         /* <<<<<< */
i--;                                         /* <<<<<< */
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

ඇයි ඔයා මේ බව i++;පසුව i--;දකුණු එකිනෙකා පසු? iඇත 0, එවිට i++පැහැයට iකිරීමට 1. ඊට පසු, i--පැහැයට iකිරීමට 0.

මුල් ප්‍රභව කේතයට සබැඳිය. ඒ සඳහා සොයන්න:

i++;
i--;

මෙය කුමක් සඳහා දැයි කිසිවෙකුට පැහැදිලි කළ හැකිද?



8
මම හිතන්නේ ඒවා කිසියම් පර්යේෂණාත්මක හෝ නිදොස් කිරීමේ කේතයක කොටසක් වන අතර එය පසුව ඉවත් කිරීමට කතුවරයාට අමතක විය.
නේට් එල්ඩ්‍රෙජ්

6
හේතුව පැහැදිලිවම ඔබව ව්‍යාකූල කිරීමයි, එය එකම අරමුණයි :-) මෙය සමහර පුරාණ සම්පාදකයක කිසියම් සම්පාදක දෝෂයක් වටා ක්‍රියා කිරීමට කුඩා අවස්ථාවක් තිබේ, එවැනි අවස්ථාවක අපට මෙම හේතුව පවසමින් අදහස් දැක්විය යුතුව තිබුණි.
gnasher729

18
@ රින්ග්: විනෝදය සඳහා මම එය gcc 1.27, 1988 දී පමණ ගොඩ්බෝල්ට්: godbolt.org/z/yYyFrQ සමඟ අත්හදා බැලුවෙමි . (එය නවීන පද්ධති ශීර්ෂයන් සමඟ ක්‍රියා නොකරයි, එබැවින් සියලු සම්මත පුස්තකාල කාර්යයන් මා විසින්ම ප්‍රකාශ කළ යුතුව තිබුණි.) නමුත් -Oඑය ඇත්ත වශයෙන්ම එම ප්‍රකාශයන් ප්‍රශස්ත කරයි.
නේට් එල්ඩ්‍රෙජ්

21
එහි තේරුම ක්‍රමලේඛකයාට ගෙවනු ලැබුවේ
රේඛාවෙනි

Answers:


152

මෙය දෝෂයකි. මෙම රේඛා එකට iනොවෙනස්ව පැවතීමට හේතු වේ , එබැවින් ඒවා එහි නොතිබිය යුතුය.

Nmap හඳුන්වා දුන් සම්බන්ධිත ලිපිය 1997 සැප්තැම්බර් 1 වන දින ප්‍රකාශයට පත් කරන ලදි. ඔබ https://svn.nmap.org/nmap හි nmap සඳහා වන SVN ගබඩාව දෙස බැලුවහොත් , 1998 පෙබරවාරි 10 වන දින පරීක්ෂා කරන ලද මූලික සංශෝධනයට එම රේඛා නොමැත:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;

ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

එබැවින් මෙය ආරම්භක nmap ප්‍රභව කේතය සහ SVN වෙත ආරම්භක පිරික්සුම ප්‍රකාශයට පත් කිරීම අතර කතුවරයා සොයාගෙන ස්ථාවර කර ඇති දෙයකි.


1
හ්ම් එම පිටුවේ <pre>ලිපිය වටා ටැග් ද නොමැත; DOM ඉදිකිරීමේදී යම්කිසි ලියකියවිලි හැසිරවීමට එය හේතු වන්නේ කෙසේදැයි ක්‍රෝම් පරීක්ෂක විසින් හෙළි කරයි;)
පියාපත් සහිත ග්‍රහක

4
එය සම්පූර්ණයෙන්ම බලාපොරොත්තු නොවූ පා readers කයින් ව්‍යාකූල කරයි. මම කියන්නේ එය පැහැදිලිවම දෝෂයක් බවයි. ;-)
සර්ගට්

2
@sergut විකිපීඩියා ඔබ සමඟ එකඟ නොවේ, නමුත් මෙම බ්ලොග් සටහන එය කරයි, මමත් එසේ කිරීමට කැමැත්තෙමි :-)
Toivo Säwén

4
දැන් iඉන්ටර් එකක් නොව ක්‍රියාකරු අධි බර සහිත සමහර විසිතුරු පංතියක් නම්, මෙය සමහර අතුරු ආබාධ ඇති කළ හැකි ය (නොහැක්කක් හා සාමාන්‍යයෙන් දුර්වල කේතීකරණ භාවිතයේ සං sign ාවක් වුවද). (මෙය අදාළ වන්නේ ඇත්ත වශයෙන්ම C ++ නම් පමණි.)
ඩැරල් හොෆ්මන්

5
සමහර සන්දර්භය තුළ (මතක සිතියම්ගත කළ IO), විචල්‍යයක් වෙනස් කිරීම බාහිර බලපෑම් ඇති කළ හැකි බව සඳහන් කිරීම වටී.
nullromo

40

එය නිෂ්ඵලය. එය කිසිසේත්ම කිසිවක් නොකරයි.

මා අනුමාන කරන්නේ නම් එය බොහෝ විට නිදොස් කිරීමේ කේතයේ ඉතිරිව ඇති අතර එය සංවර්ධනයේදී භාවිතා කරන ලදී.

මම අනුමාන කරන්නේ එක්කෝ එකක් i++හෝi-- එක් වෙනසකින් හඳුන්වා දුන් අතර අනෙක වෙනත් ආකාරයකින් හඳුන්වා දුන් බවයි.

ආරම්භක මූලාශ්‍ර නිකුතුව සහ පළමු එස්වීඑන් සංශෝධනය අතර සංශෝධන ඉතිහාසයක් නොතිබූ හෙයින් හඳුන්වාදීමේ ලක්ෂ්‍යය සොයා ගැනීමට මට හැකියාවක් නැත.


14
කේත නිදොස් කිරීම පිළිබඳ සමපේක්ෂනය නිවැරදි යැයි මම සිතමි. ඔබ බලාපොරොත්තු වන තැනට කඩඉම් ලකුණු ලබා ගැනීම සඳහා මම විවිධාකාරයේ නිදොස් කිරීමේ කේත දැක ඇත්තෙමි.
නේතන් ගොයිංස්

9

ප්‍රශස්තිකරණය නොකරන සම්පාදකයෙකුට හෝ දෘඩාංග අතුරු ආබාධ හඳුනාගත් එකක් සඳහා, i ++; i-- අනුක්‍රමය නිසා මතකයෙන් කියවීමටත්, නැවත ලිවීමටත්, for loop හරහා ගෙන යන මාර්ගය නොතකා කූඩුව තිබේ නම්.

සමාන්තර සැකසීමේදී, කේත අනුක්‍රමයක් ගෝලීය පිටපත් වලට වඩා එහි දේශීය පිටපත් භාවිතා කරන බව සහතික කිරීම සඳහා සමහර විට සම්පාදක හක්ක ගනු ලැබේ.

උදාහරණය කේත ස්නිපටයක් බැවින්, භාවිතා කළ සම්පාදකය, අපේක්ෂිත මෙහෙයුම් පද්ධතිය / දෘඩාංග හෝ මෙය ස්වාධීන නූල් ලෙස ක්‍රියාත්මක කළ හැකි කේත අනුක්‍රමයක / ශ්‍රිතයක තිබේද යන්න තීරණය කළ නොහැක.

සරල පද්ධති වලදී, නිදොස් කිරීමේ පරිසරයක උගුලේ ලක්ෂණය ක්‍රියාත්මක කිරීම සඳහා මම තාවකාලිකව විචල්‍යයන් වෙනස් කිරීමට බල කර ඇත. එය එසේ නම්, සංවර්ධනය අවසන් වූ විට කේතය ඉවත් කිරීමට කතුවරයාට අමතක වන්නට ඇත.


1
එසේනම් එය වාෂ්පශීලී යැයි ප්‍රකාශ නොකරන්නේ ඇයි?
vsz

6
iදේශීය විචල්‍යයක් ලෙස ප්‍රකාශ කිරීම ඉහත කේතයේ දක්වා ඇති අතර, i++; i--රේඛා ඇති ස්ථානයේ වෙනත් ත්‍රෙඩ් එකකට ප්‍රවේශ විය හැකි ක්‍රමයක් නොමැත .
interjay

@vsz මම හිතන්නේ ඔහු අදහස් කරන්නේ iඅස්ථාවර වීමට බල කෙරී ඇති බවයි. මම සී හෝ සී ++ වලින් නූල් ගැසීම සම්බන්ධයෙන් කටයුතු කර නැත, එබැවින් එය වාෂ්පශීලී ලෙස සැලකිය හැක්කේ කෙසේද සහ i++; i--එය යටපත් කරන්නේ කෙසේද යන්න පිළිබඳ කිසිදු හෝඩුවාවක් මා සතුව නොමැත .
ඊගෝර් හාන්ස්

නූල්-ආරක්ෂාව හැරුණු විට වාෂ්පශීලී වෙනත් අරමුණු ඇත. සම්පාදකයා එය ප්‍රශස්තිකරණය නොකරන බව සහතික කිරීම සඳහා එය නිදොස් කිරීමේදී ද භාවිතා කළ හැකිය.
vsz

2

යාවත්කාලීන කළ කේතය පමණක් පරීක්ෂා කර බැලීමට මම ඔබට යෝජනා කරමි. ඔබ (i = 2 + 1) භාවිතා කළහොත් ඊට පසු (i-1) තේරුමක් නැත. I හි අගය නොවෙනස්ව පවතී. ඔබට ඕනෑම c හෝ c ++ සම්පාදකයක් භාවිතා කර එය උත්සාහ කළ හැකිය. හෝ වෙනත් ඕනෑම භාෂාවකින් එය සමාන වේ. මම වැරදි හෝ හරි දැයි බැලීමට කේතය සම්පාදකයා තුළ ධාවනය කරන්න, මම වැරදි පිළිතුරක් ලබා දෙන්නේදැයි මට දන්වන්න.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.