නිර්වචනය නොකළ හැසිරීම සහ අනුක්‍රමික කරුණු


993

“අනුක්‍රමික ලකුණු” යනු කුමක්ද?

නිර්වචනය නොකළ හැසිරීම සහ අනුක්‍රමික ලක්ෂ්‍ය අතර සම්බන්ධය කුමක්ද?

මට a[++i] = i;වඩා හොඳ හැඟීමක් ඇති කර ගැනීම සඳහා මම බොහෝ විට විහිලු සහ සංකෝචිත ප්‍රකාශන භාවිතා කරමි. මා ඒවා භාවිතා කිරීම නැවැත්විය යුත්තේ ඇයි?

ඔබ මෙය කියවිය කර තිබේ නම්, පසු විපරම් ප්රශ්නය සංචාරය කිරීමට වග බලා ගන්න අනිශ්චිත හැසිරීම හා අනුක්රමය ලකුණු Reloaded .

(සටහන: මෙම කිරීමට ප්රවේශය විය අදහස් Stack පමාණය ගේ C ++ නිතර අසන පැන ඔබ එසේ නම්, මෙම ආකෘති පත්රය දී නිතර අසන ප්රශ්න ලබාදීමේ අදහස විචාරයට ලක් කිරීමට අවශ්ය නම්. මෙටා මත පෝස්ට් මේ සියල්ල ආරම්භ ඒක කරන්න සිදු වනු ඇත පිළිතුරු. නිතර අසන පැන අදහස ආරම්භ වූ C ++ චැට් රූම් තුළ එම ප්‍රශ්නය අධීක්ෂණය කරනු ලැබේ , එබැවින් ඔබේ පිළිතුර අදහස ඉදිරිපත් කළ අයට කියවීමට බොහෝ දුරට ඉඩ ඇත.)

Answers:


685

සී ++ 98 සහ සී ++ 03

මෙම පිළිතුර C ++ ප්‍රමිතියේ පැරණි අනුවාද සඳහා ය. සම්මතයේ C ++ 11 සහ C ++ 14 අනුවාදවල විධිමත් ලෙස 'අනුක්‍රමික ලකුණු' අඩංගු නොවේ; මෙහෙයුම් 'පෙර අනුපිළිවෙලට' හෝ ​​'අනුක්‍රමික' හෝ 'අවිනිශ්චිත අනුපිළිවෙලට' ඇත. ශුද්ධ ආචරණය අත්‍යවශ්‍යයෙන්ම සමාන ය, නමුත් පාරිභාෂිතය වෙනස් ය.


වියාචනය : හරි. මෙම පිළිතුර ටිකක් දිගු ය. එබැවින් එය කියවන විට ඉවසීමෙන් කටයුතු කරන්න. ඔබ මේ දේවල් දැනටමත් දන්නවා නම්, ඒවා නැවත කියවීමෙන් ඔබට පිස්සු වැටෙන්නේ නැත.

පූර්ව අවශ්‍යතා : සී ++ ප්‍රමිතිය පිළිබඳ මූලික දැනුමක්


අනුක්‍රමික ස්ථාන යනු කුමක්ද?

ස්ටෑන්ඩර්ඩ් පවසයි

අනුක්‍රමික ලක්ෂ්‍ය ලෙස හැඳින්වෙන ක්‍රියාත්මක කිරීමේ අනුපිළිවෙලෙහි නිශ්චිත ස්ථානවල , පෙර ඇගයීම්වල සියලු අතුරු ආබාධ සම්පූර්ණ විය යුතු අතර පසුකාලීන ඇගයීම්වල අතුරු ආබාධ කිසිවක් සිදු නොවනු ඇත. (§1.9 / 7)

අතුරු ආබාධ? අතුරු ආබාධ මොනවාද?

ප්‍රකාශනයක් ඇගයීම මගින් යමක් නිපදවන අතර ඊට අමතරව ක්‍රියාත්මක කිරීමේ පරිසරයේ තත්වයෙහි වෙනසක් සිදුවුවහොත් ප්‍රකාශනයට (එහි ඇගයීමට) යම් අතුරු ආබාධයක් ඇති බව කියනු ලැබේ.

උදාහරණයක් වශයෙන්:

int x = y++; //where y is also an int

ආරම්භක මෙහෙයුමට අමතරව ක්‍රියාකරුගේ yඅතුරු ආබාධය හේතුවෙන් වටිනාකම වෙනස් ++වේ.

මේ වනතෙක් ගොඩක් හොඳයි. අනුක්‍රමික ස්ථාන කරා ගමන් කිරීම. Comp.lang.c කර්තෘ විසින් ලබා දී ඇති seq-points වල විකල්ප අර්ථ දැක්වීම Steve Summit:

අනුක්‍රමික ලක්ෂ්‍යය යනු දූවිලි සමනය වී ඇති කාල පරිච්ඡේදයක් වන අතර මෙතෙක් දැක ඇති සියලුම අතුරු ආබාධ සම්පූර්ණ බව සහතික කෙරේ.


සී ++ ප්‍රමිතියේ ලැයිස්තුගත කර ඇති පොදු අනුක්‍රමික කරුණු මොනවාද?

ඒවා:

  • පූර්ණ ප්‍රකාශනය ඇගයීම අවසානයේ ( §1.9/16) (පූර්ණ ප්‍රකාශනය යනු වෙනත් ප්‍රකාශනයක උප ප්‍රකාශනයක් නොවන ප්‍රකාශනයකි.) 1

    උදාහරණයක් :

    int a = 5; // ; is a sequence point here
  • පළමු ප්‍රකාශනය ( §1.9/18) 2 ඇගයීමෙන් පසු පහත සඳහන් එක් එක් ප්‍රකාශනය ඇගයීමේදී

    • a && b (§5.14)
    • a || b (§5.15)
    • a ? b : c (§5.16)
    • a , b (§5.18)(මෙහි a, b කොමා ක්රියාකරු ය; දී func(a,a++) ,කොමා ක්රියාකරු නොවේ, එය හුදෙක් තර්ක අතර වෙන්කර තියෙන්නේ aහා a++ඒ අනුව හැසිරීම එම නඩුව (නම් නිර්වචනය නොකළ ඇත. aප්රාථමික වර්ගය ලෙස සැලකේ))
  • ශ්‍රිත ඇමතුමකදී (ශ්‍රිතය පේළිගතව පවතීද නැද්ද යන්න), ශ්‍රිත ශරීරයේ කිසියම් ප්‍රකාශනයක් හෝ ප්‍රකාශයක් ක්‍රියාත්මක කිරීමට පෙර සිදුවන සියලුම ශ්‍රිත තර්ක (ඇත්නම්) ඇගයීමෙන් පසුව ( §1.9/17).

1: සටහන: පූර්ණ ප්‍රකාශනයක ඇගයීම සඳහා පූර්ණ ප්‍රකාශනයේ ශබ්දකෝෂයේ කොටසක් නොවන උප ප්‍රකාශන ඇගයීම ඇතුළත් කළ හැකිය. නිදසුනක් ලෙස, පෙරනිමි තර්ක ප්‍රකාශන (8.3.6) තක්සේරු කිරීමට සම්බන්ධ උප ප්‍රකාශන, ශ්‍රිතය ලෙස හඳුන්වන ප්‍රකාශනය තුළ නිර්මාණය කරන ලද්දක් ලෙස සලකනු ලැබේ, පෙරනිමි තර්කය අර්ථ දක්වන ප්‍රකාශනය නොවේ

2: 5 වන වගන්තියේ විස්තර කර ඇති පරිදි, ක්‍රියාකරවන්නන් ගොඩනංවන ලද ක්‍රියාකරුවන් වේ. මෙම ක්‍රියාකරුවන්ගෙන් එක් අයෙකු වලංගු සන්දර්භයක් තුළ (13 වන වගන්තිය) අධික ලෙස පටවන විට, පරිශීලක අර්ථ දක්වන ලද ක්‍රියාකරු ශ්‍රිතයක් නම් කරන විට, ප්‍රකාශනය මඟින් ක්‍රියාකාරී ආයාචනයක් සහ ඔපෙරන්ඩ්ස් තර්ක ලැයිස්තුවක් සාදයි, ඒවා අතර අනුක්‍රමික ලක්ෂ්‍යයක් නොමැතිව.


නිර්වචනය නොකළ හැසිරීම යනු කුමක්ද?

ස්ටෑන්ඩර්ඩ් වගන්තිය අනිශ්චිත හැසිරීම නිර්වචනය §1.3.12ලෙස

හැසිරීම, එවැනි සඳහා මෙම ජාත්යන්තර සම්මත පනවයි, වැරදි වැඩ ඉදිකිරීමක් හෝ වැරදි සහගත දත්ත භාවිතය මත මතු විය ලෙස කිසිදු අවශ්යතා 3 .

මෙම අන්තර්ජාතික ප්‍රමිතිය මගින් හැසිරීම පිළිබඳ කිසියම් පැහැදිලි අර්ථ දැක්වීමක් මඟ හැරෙන විට නිර්වචනය නොකළ හැසිරීම ද අපේක්ෂා කළ හැකිය.

3: අවසර ලත් නිර්වචනය නොකළ හැසිරීම, අනපේක්ෂිත ප්‍රති results ල සමඟ තත්වය නොසලකා හැරීම, පරිවර්තන හෝ වැඩසටහන් ක්‍රියාත්මක කිරීමේදී පරිසරයේ ලක්ෂණයක් ලෙස ලේඛනගත ආකාරයකින් හැසිරීම (රෝග විනිශ්චය පණිවිඩයක් නිකුත් කිරීම සමඟ හෝ නැතිව), පරිවර්තනයක් හෝ ක්‍රියාත්මක කිරීමක් අවසන් කිරීම දක්වා පරාසයක පවතී. (රෝග විනිශ්චය පණිවිඩයක් නිකුත් කිරීමත් සමඟ).

කෙටියෙන් කිවහොත්, නිර්වචනය නොකළ හැසිරීම යනු ඔබේ නාසයෙන් පියාසර කරන ඩීමන් සිට ඔබේ පෙම්වතිය ගැබ් ගැනීම දක්වා ඕනෑම දෙයක් සිදුවිය හැකිය.


නිර්වචනය නොකළ හැසිරීම සහ අනුක්‍රමික ස්ථාන අතර ඇති සම්බන්ධය කුමක්ද?

මා එයට පිවිසීමට පෙර නිර්වචනය නොකළ හැසිරීම, නිශ්චිතව දක්වා නැති හැසිරීම සහ ක්‍රියාත්මක කිරීමේ නිර්වචනය කළ හැසිරීම අතර වෙනස ඔබ දැන සිටිය යුතුය .

ඔබත් එය දැන සිටිය යුතුයි the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified.

උදාහරණයක් වශයෙන්:

int x = 5, y = 6;

int z = x++ + y++; //it is unspecified whether x++ or y++ will be evaluated first.

මෙහි තවත් උදාහරණයක් .


දැන් ස්ටෑන්ඩර්ඩ් ඉන් §5/4පවසයි

  • 1) පෙර සහ ඊළඟ අනුක්‍රමික ලක්ෂ්‍යය අතර පරිමාණ වස්තුවකට එහි ගබඩා කළ අගය ප්‍රකාශනයක් ඇගයීමෙන් එකවර වෙනස් කළ යුතුය.

එයින් අදහස් කරන්නේ කුමක් ද?

අවිධිමත් ලෙස එයින් අදහස් වන්නේ අනුක්‍රමික ලක්ෂ්‍ය දෙකක් අතර විචල්‍යයක් එක් වරකට වඩා වෙනස් නොකළ යුතු බවයි. ප්‍රකාශන ප්‍රකාශයක, next sequence pointඑය සාමාන්‍යයෙන් අවසන් වන අර්ධ සළකුණෙහි වන අතර previous sequence pointඑය පෙර ප්‍රකාශයේ අවසානයේ වේ. ප්‍රකාශනයක අතරමැදි ද අඩංගු විය හැකිය sequence points.

ඉහත වාක්‍යයෙන් පහත දැක්වෙන ප්‍රකාශයන් නිර්වචනය නොකළ හැසිරීමක් ඉල්ලා සිටී:

i++ * ++i;   // UB, i is modified more than once btw two SPs
i = ++i;     // UB, same as above
++i = 2;     // UB, same as above
i = ++i + 1; // UB, same as above
++++++i;     // UB, parsed as (++(++(++i)))

i = (i, ++i, ++i); // UB, there's no SP between `++i` (right most) and assignment to `i` (`i` is modified more than once btw two SPs)

නමුත් පහත දැක්වෙන ප්‍රකාශන කදිමයි:

i = (i, ++i, 1) + 1; // well defined (AFAIK)
i = (++i, i++, i);   // well defined 
int j = i;
j = (++i, i++, j*i); // well defined

  • 2) තවද, පෙර වටිනාකමට ප්‍රවේශ විය යුත්තේ ගබඩා කළ යුතු වටිනාකම තීරණය කිරීම සඳහා පමණි.

එයින් අදහස් කරන්නේ කුමක් ද? එහි අර්ථය වන්නේ යම් වස්තුවක් සම්පූර්ණ ප්‍රකාශනයක් තුළ ලියා ඇත්නම්, එකම ප්‍රකාශනය තුළ ඇති ඕනෑම හා සියලු ප්‍රවේශයන් ලිවිය යුතු අගය ගණනය කිරීමට directly ජුව සම්බන්ධ විය යුතුය .

උදාහරණයක් ලෙස (LHS සහ RHS හි) i = i + 1සියලුම ප්‍රවේශයන් ලිවිය යුතු අගය ගණනය කිරීමට සෘජුවම සම්බන්ධ වේ . එබැවින් එය හොඳයි.i

මෙම රීතිය නවීකරණයට පෙර ප්රවේශයන් ප්රදර්ශනය කළ හැකි අයට නීතිමය ප්රකාශනයන් effectively ලදායී ලෙස සීමා කරයි.

උදාහරණ 1:

std::printf("%d %d", i,++i); // invokes Undefined Behaviour because of Rule no 2

උදාහරණ 2:

a[i] = i++ // or a[++i] = i or a[i++] = ++i etc

i(එක් අයෙකුගේ a[i]) ප්‍රවේශයකට i හි ගබඩා කර ඇති අගයට කිසිදු සම්බන්ධයක් නැති නිසා (එය සිදු වේ i++), එබැවින් නිර්වචනය කිරීමට හොඳ ක්‍රමයක් නොමැත - අපගේ අවබෝධය සඳහා හෝ සම්පාදකයාගේ - වැඩි කළ අගය ගබඩා කිරීමට පෙර හෝ පසුව ප්‍රවේශය සිදුවිය යුතුද යන්න. එබැවින් හැසිරීම නිර්වචනය කර නැත.

උදාහරණ 3:

int x = i + i++ ;// Similar to above

C ++ 11 සඳහා පසු විපරම් පිළිතුර මෙතැනින් .


45
*p++ = 4 නිර්වචනය නොකළ හැසිරීම නොවේ. *p++ලෙස අර්ථ දැක්වේ *(p++). p++ප්‍රතිලාභ p(පිටපතක්) සහ පෙර ලිපිනයේ ගබඩා කර ඇති වටිනාකම. එය යූබී වෙත යොමු කරන්නේ ඇයි? එය ඉතා හොඳයි.
ප්‍රසුන් සෞරව්

7
Ike මයික්: AFAIK, ඔබට සම්බන්ධ කළ හැකි C ++ ප්‍රමිතියේ (නීතිමය) පිටපත් නොමැත.
sbi

11
හොඳයි, එවිට ඔබට ISO හි අදාළ ඇණවුම් පිටුවට සබැඳියක් තිබිය හැකිය. කෙසේ වෙතත්, ඒ ගැන සිතන විට, "සී ++ ප්‍රමිතිය පිළිබඳ මූලික දැනුම" යන වාක්‍ය ඛණ්ඩය තරමක් පරස්පර විරෝධී බවක් පෙනේ, මන්ද ඔබ ප්‍රමිතිය කියවන්නේ නම්, ඔබ ප්‍රාථමික මට්ටම පසු කර ඇත. ප්‍රකාශන වාක්‍ය ඛණ්ඩය, මෙහෙයුම් අනුපිළිවෙල සහ ක්‍රියාකරු අධික ලෙස පැටවීම වැනි මූලික අවබෝධයක් අවශ්‍ය භාෂාවේ ඇති දේවල් අපට ලැයිස්තු ගත කළ හැකිද?
මයික් ඩෙසිමෝන්

42
නවකයන්ට ඉගැන්වීමට හොඳම ක්‍රමය ප්‍රමිතිය උපුටා දැක්වීම බව මට විශ්වාස නැත
ප්‍රතිලෝම

6
D ඒඩ්‍රියන් පළමු ප්‍රකාශනය යූබී එකක් ඉල්ලා සිටින්නේ අන්තිම ++iසහ පැවරුම අතර අනුක්‍රමික ලක්ෂ්‍යයක් නොමැති බැවිනි i. ප්රකාශනය නිසා දෙවන ප්රකාශනය යුනියන් පහ නැත iවටිනාකම වෙනස් කරන්නේ නැහැ i. දෙවන උදාහරණයේ දී පැවරුම් ක්‍රියාකරු කැඳවීමට පෙර i++අනුක්‍රමික ලක්ෂ්‍යයක් ( ,) අනුගමනය කරයි .
කොලූන්යා

276

මෙය මගේ පෙර පිළිතුරට පසු විපරමක් වන අතර C ++ 11 ආශ්‍රිත තොරතුරු අඩංගු වේ. .


පූර්ව අවශ්‍යතා : සබඳතා පිළිබඳ මූලික දැනුමක් (ගණිතය).


සී ++ 11 හි අනුක්‍රමික ස්ථාන නොමැති බව සත්‍යයක් ද?

ඔව්! මෙය ඉතා සත්‍යයකි.

අනුපිළිවෙල පොයින්ට්ස් මගින් ප්රතිස්ථාපනය කර ඇත කර පෙර අනුකමණය සහ අනුකමණය පසු (සහ Unsequenced හා Indeterminately අනුකමණය ) සබඳතා දී C ++ 11.


මෙම 'අනුක්‍රමික පෙර' දේ හරියටම කුමක්ද?

අනුක්‍රමික පෙර (§1.9 / 13) යනු සම්බන්ධතාවයකි:

ඇගයීම් අතර තනි විසින් මරා නූල් හා උත්තේජනය දැඩි අර්ධ සඳහා 1

නිල වශයෙන් එය ඕනෑම ඇගයීම් දෙකක් අදහස් (පහත බලන්න) A සහ B, නම් Aවේ පෙර අනුකමණය B , පසුව ඝාතනය A ජෝඩු යුතු ඝාතනය B. නම් Aපෙර අනුකමණය නොවේ Bහා Bපෙර අනුකමණය නැත Aඑසේ නම්, Aසහ Bunsequenced 2 .

ඇගයීම් Aහා Bකරන indeterminately අනුකමණය එක්කෝ විට Aපෙර අනුකමණය ඇත Bහෝ Bපෙර අනුකමණය ඇත A, නමුත් එය කළ නම් නොකල වේ 3 .

[සටහන්]
1: දැඩි අර්ධ අනුපිළිවෙලක් ද්විමය සම්බන්ධතාවයකි "<" මාලාවක් කට Pවන asymmetricඅතර, transitiveසියලු, එනම්, a, b, හා cදී P: අපි ඒ ඇති
........ (i). <b නම් ¬ (b <a) ( asymmetry);
........ (ii). <b සහ b <c නම් <c ( transitivity).
2: අනපේක්ෂිත ඇගයීම් ක්‍රියාත්මක කිරීම අතිච්ඡාදනය විය හැකිය .
3: අවිනිශ්චිත අනුපිළිවෙලින් කළ ඇගයීම් අතිච්ඡාදනය කළ නොහැකි නමුත් පළමුව එය ක්‍රියාත්මක කළ හැකිය.


C ++ 11 සන්දර්භය තුළ 'ඇගයීම' යන වචනයේ තේරුම කුමක්ද?

C ++ 11 හි, ප්‍රකාශනයක් ඇගයීම (හෝ උප ප්‍රකාශනයක්) පොදුවේ ඇතුළත් වන්නේ:

දැන් (§1.9 / 14) පවසන්නේ:

පූර්ණ ප්‍රකාශනයක් හා සම්බන්ධ සෑම අගය ගණනය කිරීමක් සහ අතුරු ප්‍රති effect ලයක්ම ඇගයීමට ලක්වන ඊළඟ පූර්ණ ප්‍රකාශනය හා සම්බන්ධ සෑම අගය ගණනය කිරීමක් සහ අතුරු ආබාධයක්ම අනුපිළිවෙලට සකසා ඇත .

  • සුළු උදාහරණය:

    int x; x = 10; ++x;

    අගය ගණනය කිරීම හා අතුරු ආචරණය සමඟ සම්බන්ධිත අගය ගණනය කිරීම සහ අතුරු ආබාධය ++xඅනුක්‍රමික වේx = 10;


එබැවින් නිර්වචනය නොකළ හැසිරීම සහ ඉහත සඳහන් දේවල් අතර යම් සම්බන්ධයක් තිබිය යුතුය, නේද?

ඔව්! හරි.

(§1.9 / 15) හි එය සඳහන් කර ඇත

සටහන් තබා, තනි ක්රියාකරුවන් හා තනි තනි ප්රකාශනයන් subexpressions ක operands හි ඇගයීම් වේ හැර unsequenced 4 .

උදාහරණයක් වශයෙන් :

int main()
{
     int num = 19 ;
     num = (num << 3) + (num >> 3);
} 
  1. +ක්‍රියාකරුගේ ක්‍රියාකාරිත්වය ඇගයීම එකිනෙකට සාපේක්ෂව අනුක්‍රමික නොවේ.
  2. ඔපෙරන්ඩ් <<සහ >>ඔපරේටර්ස් ඇගයීම එකිනෙකාට සාපේක්ෂව අනුමාන නොවේ.

4: වැඩසටහනක් සම්පාදනය තුලදී එක් වරකට වඩා ඇගයීමට ලක් කරන බව ප්රකාශනයක් දී unsequenced හා indeterminately අනුකමණය එහි subexpressions හි ඇගයීම් විවිධ ඇගයීම් අනවරතයෙන් සිදු කළ යුතු නැත.

(§1.9 / 15) ක්‍රියාකරුගේ ක්‍රියාකාරිත්වයේ අගය ගණනය කිරීම ක්‍රියාකරුගේ ප්‍රති result ල අගය ගණනය කිරීමට පෙර අනුපිළිවෙලට සකසා ඇත.

එහි අර්ථය වන්නේ x + yඅගය ගණනය කිරීමේදී xසහ yඅගය ගණනය කිරීමට පෙර අනුපිළිවෙලට සකස් කිරීමයි (x + y).

වඩා වැදගත්

(§1.9 / 15) පරිමාණ වස්තුවකට අතුරු ආබාධයක් හෝ දෙකට සාපේක්ෂව අනපේක්ෂිත නම්

(අ) එකම පරිමාණ වස්තුවට තවත් අතුරු ආබාධයක්

හෝ

(බී) එකම පරිමාණ වස්තුවක අගය භාවිතා කරමින් අගය ගණනය කිරීම.

හැසිරීම නිර්වචනය කර නැත .

උදාහරණ:

int i = 5, v[10] = { };
void  f(int,  int);
  1. i = i++ * ++i; // Undefined Behaviour
  2. i = ++i + i++; // Undefined Behaviour
  3. i = ++i + ++i; // Undefined Behaviour
  4. i = v[i++]; // Undefined Behaviour
  5. i = v[++i]: // Well-defined Behavior
  6. i = i++ + 1; // Undefined Behaviour
  7. i = ++i + 1; // Well-defined Behaviour
  8. ++++i; // Well-defined Behaviour
  9. f(i = -1, i = -1); // Undefined Behaviour (see below)

ශ්‍රිතයක් කැඳවීමේදී (ශ්‍රිතය පේළිගතව තිබුණත් නැතත්), ඕනෑම තර්ක ප්‍රකාශනයකට සම්බන්ධ වූ සෑම අගය ගණනය කිරීමක් සහ අතුරු ආබාධයක් හෝ කැඳවූ ශ්‍රිතය නම් කරන ලද පෝස්ට්ෆික්ස් ප්‍රකාශනය සමඟ ශරීරයේ සෑම ප්‍රකාශනයක්ම හෝ ප්‍රකාශයක්ම ක්‍රියාත්මක කිරීමට පෙර අනුක්‍රමණය වේ. ශ්‍රිතය ලෙස හැඳින්වේ. [ සටහන: විවිධ තර්ක ප්‍රකාශන හා සම්බන්ධිත අගය ගණනය කිරීම් සහ අතුරු ආබාධ අඛණ්ඩව සිදු නොවේ . - අවසන් සටහන ]

ප්‍රකාශන (5), (7)සහ (8)නිර්වචනය නොකළ හැසිරීමට ඉඩ නොදෙන්න. වඩාත් සවිස්තරාත්මක පැහැදිලි කිරීමක් සඳහා පහත පිළිතුරු බලන්න.


අවසාන සටහන :

ඔබ ලිපියේ කිසියම් අඩුපාඩුවක් සොයා ගන්නේ නම් කරුණාකර අදහස් දක්වන්න. බලය භාවිතා කරන්නන් (rep> 20000 සමඟ) කරුණාකර යතුරු ලියනය සහ වෙනත් වැරදි නිවැරදි කිරීම සඳහා ලිපිය සංස්කරණය කිරීමට පසුබට නොවන්න.


3
"අසමමිතික" වෙනුවට, පෙර / පසු අනුපිළිවෙලට ඇත්තේ "ප්‍රති-අසමමිතික" සම්බන්ධතා ය. පසුකාලීනව ලබා දුන් අර්ධ අනුපිළිවෙලක අර්ථ දැක්වීමට අනුකූල වන පරිදි මෙය පෙළෙහි වෙනස් කළ යුතුය (එය විකිපීඩියාව සමඟ ද එකඟ වේ).
TemplateRex

1
7) අයිතමය අවසාන උදාහරණයේ යූබී එකක් වන්නේ ඇයි? සමහර විට එය එසේ විය f(i = -1, i = 1)යුතුද?
මිහායිල්

1
මම "අනුපිළිවෙලට පෙර" සම්බන්ධතාවයේ විස්තරය සවි කළෙමි. එය දැඩි අර්ධ අනුපිළිවෙලකි . නිසැකවම, ප්‍රකාශනයක් තමාට පෙර අනුපිළිවෙලට තැබිය නොහැක, එබැවින් සම්බන්ධතාවය ප්‍රත්‍යාවර්තක විය නොහැක. එබැවින් එය අසමමිතික නොවන අතර සමමිතික නොවේ.
ThomasMcLeod

1
5) මනාව නිරවුල්ව සිටීම මගේ මනස පුපුරවා හැරියේය. ජොහැන්නස් ෂෝබ්ගේ පැහැදිලි කිරීම ලබා ගැනීම සම්පූර්ණයෙන්ම සරල නැත. විශේෂයෙන්ම ++i( +එය භාවිතා කරන ක්‍රියාකරුට පෙර අගය තක්සේරු කර තිබියදීත්), එහි අතුරු ආබාධය අවසන් කළ යුතු යැයි ප්‍රමිතිය තවමත් නොකියන බව මා විශ්වාස කළ නිසා . නමුත් ඇත්ත වශයෙන්ම, එය කිරීමට ref නැවත නිසා lvalueවන iම, එය අතුරු ප්රතිඵල හා ඇගයීමේ අවසන් කළ යුතුය සිට, ඒ නිසා වටිනාකම ෙම් දක්වා විය යුතුය අවසන් යුතුය. ඇත්ත වශයෙන්ම ලබා ගැනීමට ඇති පිස්සු කොටස මෙයයි.
v.oddou

"අයිඑස්ඕ සී ++ කමිටු සාමාජිකයින් සිතුවේ අනුක්‍රමික කරුණු තේරුම් ගැනීම තරමක් අපහසු බවය. එබැවින් ඔවුන් වඩාත් පැහැදිලි වචන හා වැඩි දියුණු කළ නිරවද්‍යතාව සඳහා ඉහත සඳහන් සම්බන්ධතා සමඟ එය ප්‍රතිස්ථාපනය කිරීමට තීරණය කළහ." - එම හිමිකම් පෑම සඳහා ඔබට යොමු කිරීමක් තිබේද? නව සබඳතා තේරුම් ගැනීමට අපහසු බව මට පෙනේ.
එම්එම්

30

සී ++ 17 ( N4659) හි ප්‍රකාශන ඇගයීමේ දැඩි අනුපිළිවෙලක් අර්ථ දක්වන අයිඩියොමැටික් සී ++ සඳහා ප්‍රකාශන ඇගයීම් නියෝගයක් පිරිපහදු කිරීම ඇතුළත් වේ .

විශේෂයෙන් පහත සඳහන් වාක්‍යය

8.18 පැවරුම් සහ සංයුක්ත පැවරුම් ක්‍රියාකරුවන් :
....

සෑම අවස්ථාවකදීම, පැවරුම අනුපිළිවෙලට ඇත්තේ දකුණු හා වම් ක්‍රියාකාරිත්වයේ අගය ගණනය කිරීමෙන් පසුව සහ පැවරුම් ප්‍රකාශනයේ අගය ගණනය කිරීමට පෙර ය. දකුණු ඔපෙරන්ඩ් එක වම් ඔපෙරන්ඩ් එකට පෙර අනුපිළිවෙලට ඇත.

පහත පැහැදිලි කිරීම සමඟ

ප්රකාශනයක් X ප්රකාශනයක් පෙර අනුකමණය දක්වා තිබේ Y සෑම අගය ගණනය හා ප්රකාශනය සම්බන්ධ සෑම අතුරු ප්රතිඵල නම් X සෑම අගය ගණනය හා ප්රකාශනය සම්බන්ධ සෑම අතුරු ප්රතිඵල පෙර අනුකමණය ඇත Y .

කලින් නිර්වචනය නොකළ හැසිරීම් අවස්ථා කිහිපයක් වලංගු කරන්න.

a[++i] = i;

කෙසේ වෙතත් තවත් සමාන අවස්ථා කිහිපයක් තවමත් නිර්වචනය නොකළ හැසිරීමට තුඩු දෙයි.

තුළ N4140:

i = i++ + 1; // the behavior is undefined

නමුත් ඇතුළත N4659

i = i++ + 1; // the value of i is incremented
i = i++ + i; // the behavior is undefined

ඇත්ත වශයෙන්ම, C ++ 17 අනුකූලතා සම්පාදකයක් භාවිතා කිරීම අනිවාර්යයෙන්ම එවැනි ප්‍රකාශන ලිවීම ආරම්භ කළ යුතු යැයි අදහස් නොකෙරේ.


i = i++ + 1;c ++ 17 හි හැසිරීම නිර්වචනය කර ඇත්තේ ඇයි , මම සිතන්නේ "දකුණු ඔපෙරන්ඩ් එක වම් ඔපෙරන්ඩ් එකට පෙර අනුපිළිවෙලට සකස් කර තිබුණත්", කෙසේ වෙතත් "i ++" සඳහා වන වෙනස් කිරීම සහ පැවරුමේ අතුරු ප්‍රති sequ ල අඛණ්ඩව සිදු වේ, කරුණාකර මේවා අර්ථ නිරූපණය කිරීම සඳහා වැඩි විස්තර දෙන්න
jack X

@jackX මම පිළිතුර දිගු කළෙමි :).
ඇලෙක්ස්

ඔව්, වාක්‍යයේ අර්ථ නිරූපණය පිළිබඳ විස්තර වඩාත් ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි. “වම් ඔපෙරන්ඩ් එකට පෙර දකුණු ඔපෙරන්ඩ් එක අනුපිළිවෙලට ඇත” යන්නෙන් “වම් ඔපෙරන්ඩ් එකට පෙර දකුණු ඔපෙරන්ඩ් එක අනුපිළිවෙලට ඇත” යන්නෙන් අදහස් වන්නේ දකුණු ඔපෙරන්ඩ් සමඟ සම්බන්ධිත අගය ගණනය කිරීම සහ අතුරු ප්‍රති are ල වේ. වම් ඔපෙරන්ඩ් වලට පෙර අනුපිළිවෙලට. ඔබ කළ පරිදි :-)
කොස් X

11

වෙනස් වීමට මූලික හේතුවක් ඇතැයි මම අනුමාන කරමි, පැරණි අර්ථ නිරූපණය වඩාත් පැහැදිලි කිරීම හුදෙක් රූපලාවණ්‍ය නොවේ: එම හේතුව සමගාමී ය. විස්තාරණය කිරීමේ නිශ්චිත අනුපිළිවෙල හුදෙක් විය හැකි අනුක්‍රමික ඇණවුම් කිහිපයකින් එකක් තෝරා ගැනීමකි, මෙය ඇණවුම් කිරීමට පෙර හා පසු වෙනස් වේ, මන්ද නිශ්චිත ඇණවුමක් නොමැති නම් සමගාමී ඇගයීමක් කළ හැකි ය: පැරණි නීති සමඟ එසේ නොවේ. උදාහරණයක් ලෙස:

f (a,b)

මීට පෙර එක්කෝ b, හෝ, b පසුව a. දැන්, a සහ b අන්තර් සම්බන්ධිත උපදෙස් සමඟ හෝ විවිධ හරයන් මත පවා ඇගයීමට ලක් කළ හැකිය.


5
කෙසේ වෙතත්, 'අ' හෝ 'ආ' යන දෙකටම ක්‍රියාකාරී ඇමතුමක් ඇතුළත් වන්නේ නම්, ඒවා අනුක්‍රමික නොව අනුපිළිවෙලට අනුපිළිවෙලට සකසා ඇති බව මම විශ්වාස කරමි, එයින් කියවෙන්නේ එක් අතුරු ආබාධයක් ඇතිවීමට පෙර එක් අතුරු ආබාධයක් සිදුවිය යුතු බවයි. අනෙක, සම්පාදකයා පළමුව යන්නේ කුමක් ද යන්නට අනුකූල නොවිය යුතු වුවත්. එය තවදුරටත් සත්‍ය නොවේ නම්, එය අතිච්ඡාදනය නොවන මෙහෙයුම් මත රඳා පවතින කේත රාශියක් බිඳ දමනු ඇත (උදා: 'a' සහ 'b' එක් එක් ස්ථාපිත, භාවිතා කරන සහ පහත් කළහොත්, ස්ථිතික තත්වයක්).
සුපර් කැට්

2

දී C99(ISO/IEC 9899:TC3)මෙතෙක් මෙම සාකච්ඡාවට අතරෙ පෙනේ වන පහත සඳහන් steteents evaluaiton නියෝගය සම්බන්ධයෙන් සිදු කෙරේ.

[...] උප ප්‍රකාශන ඇගයීමේ අනුපිළිවෙල සහ අතුරු ආබාධ සිදුවන අනුපිළිවෙල යන දෙකම නිශ්චිතව දක්වා නැත. (6.5 පි. 67 වගන්තිය)

මෙහෙයුම් ඇගයීමේ අනුපිළිවෙල නිශ්චිතව දක්වා නැත. පැවරුම් ක්‍රියාකරුවෙකුගේ ප්‍රති result ලය වෙනස් කිරීමට හෝ ඊළඟ අනුක්‍රමික ලක්ෂ්‍යයෙන් පසුව එයට ප්‍රවේශ වීමට උත්සාහයක් දරන්නේ නම්, හැසිරීම [sic] නිර්වචනය කර නොමැත (6.5.16 පි. 91 කොටස)


2
ප්‍රශ්නය ටැග් කර ඇත්තේ සී ++ මිස සී නොවේ, එය හොඳයි, මන්ද සී ++ 17 හි හැසිරීම පැරණි අනුවාදවල හැසිරීමට වඩා බෙහෙවින් වෙනස් ය - සහ සී 11, සී 99, සී 90 යනාදී හැසිරීම් වලට කිසිදු සම්බන්ධයක් නැත. එයට සම්බන්ධයි. සමස්තයක් වශයෙන්, මම මෙය ඉවත් කිරීමට යෝජනා කරමි. වඩා වැදගත් දෙය නම්, අපි C සඳහා සමාන ප්‍රශ්නෝත්තරයක් සොයාගෙන එය හරි දැයි තහවුරු කර ගත යුතුය (සහ C ++ 17, විශේෂයෙන් නීති රීති වෙනස් කරන බව සටහන් කරයි - C ++ 11 සහ ඊට පෙර හැසිරීම වැඩි හෝ අඩු වශයෙන් සමාන විය C11 හි, එය C හි විස්තර කරන වාක්‍ය ඛණ්ඩය තවමත් 'අනුක්‍රමික ලක්ෂ්‍ය' භාවිතා කරන අතර C ++ 11 සහ පසුව එය භාවිතා නොකරයි.
ජොනතන් ලෙෆ්ලර්
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.