C ++ හි “->” ක්‍රියාකරු යනු කුමක්ද?


8927

C ++ / STL හි සැඟවුණු විශේෂාංග සහ අඳුරු කොන කියවීමෙන් පසු comp.lang.c++.moderated, පහත දැක්වෙන ස්නිපටය විෂුවල් ස්ටුඩියෝ 2008 සහ ජී ++ 4.4 යන දෙවර්ගයේම සම්පාදනය කර වැඩ කිරීම ගැන මම පුදුමයට පත් වීමි.

මෙන්න කේතය:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

ප්‍රතිදානය:

9 8 7 6 5 4 3 2 1 0

මම හිතන්නේ මෙය සී, එය ජීසීසී හි ද ක්‍රියාත්මක වන නිසා. මෙය ප්‍රමිතියෙන් අර්ථ දක්වා ඇත්තේ කොහෙන්ද? එය පැමිණියේ කොහෙන්ද?


503
නැතහොත් නිසි පරතරය පවා ... විචල්යය අතර හෝ ++ඊට --පෙර හෝ ඊට පෙර අවකාශයක් මා දැක ඇති බව මම නොසිතමි ...
මැතිව් ෂාර්ලි

1155
මෙම "වෙත" ක්‍රියාකරු ආපසු හැරවිය හැකිය (0 <- x). තවද "ධාවනය කිරීමට" ක්‍රියාකරු (0 <---- x) ඇත. ගීස්, මම මෙතෙක් අසා ඇති විනෝදජනක දෙය නම් c ++ syntax =) +1 ප්‍රශ්නය සඳහා.
SadSido

233
හාස්‍යජනක ලෙස, අර්ථ නිරූපණය ඉතා වැරදියි, නමුත් එය කේතය නිවැරදිව කරන දේ විස්තර කරයි. :)
නොල්ඩෝරින්

811
නව සින්ටැක්ස් හැකියාවන් ගැන සිතන්න: #define upto ++<, #define downto -->. ඔයා තමයි හැඟීමක් නපුරු නම්, ඔබට කළ හැකි #define for while(සහ #define do ) {(හා #define done ;}) හා ලිවීම් for x downto 0 do printf("%d\n", x) doneඅහෝ, මනුෂ්යත්වයට ...
ක්රිස් ලුට්ෂ්

98
කේතකරණයේ නව ප්‍රකාශන ක්‍රමයක් සඳහා ඇති හැකියාව විවෘත කරයි, මේ සඳහා සම්පාදක අනතුරු ඇඟවීම් කිහිපයක් කැප කිරීම වටී: bool CheckNegative (int x) {ආපසු x <0? හරි වැරදි ); }
ttt

Answers:


8606

-->ක්‍රියාකරුවෙකු නොවේ. ඇත්ත වශයෙන්ම එය වෙනම ක්‍රියාකරුවන් දෙදෙනෙකි, --සහ >.

කොන්දේසිගත කේතය අඩු xවන අතර, එහි xමුල් (අඩු නොකළ) අගය නැවත ලබා දෙන අතර, පසුව මුල් අගය ක්‍රියාකරු 0භාවිතා කිරීම සමඟ සංසන්දනය කරයි >.

වඩා හොඳින් අවබෝධ කර ගැනීම සඳහා ප්‍රකාශය පහත පරිදි ලිවිය හැකිය:

while( (x--) > 0 )

262
ඉන්පසු නැවතත්, එම සන්දර්භය තුළ යම් ආකාරයක පරාස ක්‍රියාකරුවෙකු මෙන් පෙනේ.
චාල්ස් සැල්වියා

109
X පසු-අඩුවී 0 හා සසඳන විට x හා සසඳන විට x අඩු වේ යැයි කීම සමාන වේ
චාල්ස් සැල්වියා

8
මම හිතන්නේ නැහැ එය එසේමය කියා. මම හිතන්නේ "එහෙනම්" යන වචනයෙන් ඇඟවෙන්නේ අනුපිළිවෙලක් ඇති බවයි (පසු අඩුවීමෙන් පසු x හි අගය එකකට වඩා අඩුය). මම හිතන්නේ කෙනෙකුට එය පැහැදිලි කිරීම සඳහා "ඔබ පෝස්ට් x අඩු කරමින් එහි පැරණි අගය හා 0 ..." සංසන්දනය කළ හැකිය. නමුත් මෙය කෙසේ හෝ නට්පික් කිරීමකි. එහි තේරුම කුමක්දැයි අපි කවුරුත් දනිමු.
ජොහැන්නස් ෂෝබ් -

38
ජාවා හි එය ද සම්පාදනය කරයි :)
ස්ටීවන් දේවිජ්වර්

44
එහි නම, ay ජේ, නරක ක්‍රමලේඛන විලාසිතාවකි :-) ප්‍රශ්නය මුලින් ඇසූ කාරණය මෙයින් සනාථ වේ. සම්බන්ධයක් නැති දෙයකට වඩා ක්‍රියාකරුවන් ක්‍රියා කරන දෙයට පෙළ සම්බන්ධ කිරීම වඩා අර්ථවත් කරයි, එබැවින් while (x-- > 0)වඩාත් යෝග්‍ය වේ. සිදුවෙමින් පවතින දේ (අවම වශයෙන් ස්ථාවර-අකුරු සංස්කාරකයක) එය වඩාත් පැහැදිලි කරයි, එයින් අදහස් වන්නේ මෙම පිළිතුරේ වරහන් අවශ්‍ය නොවන බවයි.
paxdiablo

3132

නැතහොත් සම්පූර්ණයෙන්ම වෙනස් දෙයක් සඳහා ... xවිනිවිදක 0.

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

එතරම් ගණිතමය නොවේ, නමුත් ... සෑම පින්තූරයකම වචන දහසක් පින්තාරු කරයි ...


216
@mafutrct - මට මතක පරිදි C හි C ඊළඟ පේළිය එකතු කරන්නේ රේඛීය බිඳීමක් නොමැති ආකාරයට ය. මෙහි සිටින අය මූලික වශයෙන් කිසිවක් නොකරයි.
හොගන්

2
linemafu '\' අක්ෂරය සම්පාදකයාට පවසන්නේ වත්මන් පේළිය ඊළඟ පේළියේ දිගටම පවතින බවත් එබැවින් සම්පාදකයා පේළි දෙකම ඒකාබද්ධ කර එකක් ලෙස සම්පාදනය කළ යුතු බවත්ය. 'අතර (x -> 0)' x -1 ට සමාන වන තෙක් ක්‍රියාත්මක වේ. නමුත්, ඔහු ඉන්ඩෙන්ටේෂන් කරන ආකාරය නිසා x ශුන්‍යයට ලිස්සා යන බවක් පෙනේ. 'X 0 දක්වා ලිස්සා යන අතර ...'
ෆෙලිප්

16
IIRC, K&R C, අඩුකිරීමේ ක්‍රියාකරු තුළ '-s' අතර සුදු පැහැති අවකාශයක් ඇති කිරීමට ඉඩ දී ඇති අතර, එම අවස්ථාවේ දී ඔබට එහි පිටුපස බැක්ස්ලෑෂ් තිබිය හැකි අතර එය වඩාත් සිසිල් වනු ඇත. :)
ජූල්ස්

10
R අර්නව්බෝර්බෝරා එය පැරණි ප්‍රකාශන අර්ථයක් why waste words when a picture does a better jobවන අතර මෙම සන්දර්භය තුළ විහිළුවක් ලෙස භාවිතා කරයි. (ඇත්ත වශයෙන්ම වචන 2 ක් whileසහ printf)
සමමුහුර්ත නොකළ

88
ඔව්, අපැහැදිලි විනිවිදක ක්‍රියාකරු. මම කොහොමද අමතක කරන්නේ!
යක්ෂයා

2378

එය ඉතා සංකීර්ණ ක්‍රියාකරුවෙකි, එබැවින් ISO / IEC JTC1 (ඒකාබද්ධ තාක්ෂණික කමිටුව 1) පවා එහි විස්තරය C ++ ප්‍රමිතියේ විවිධ කොටස් දෙකක තැබීය.

පසෙකට විහිලු, ඔවුන් දෙදෙනා වෙනස් ක්රියාකරුවන් වේ: --හා >§5.2.6 / 2 පිළිවෙලින් විස්තර §5.9 C ++ 03 සම්මත.


1278

එය සමාන වේ

while (x-- > 0)

x--(පසු අඩුවීම) ඒ හා සමාන වේ x = x-1, කේතය පහත පරිදි පරිවර්තනය වේ:

while(x > 0) {
    x = x-1;
    // logic
}
x--;   // The post decrement done when x <= 0

15
මෙය තරමක් නිවැරදි නැත. දෙවන අවස්ථාවෙහිදී ලූප් ශරීරය තුළ x හි අගය වෙනස් වේ. ඔබේ උදාහරණයේ ඇති පැවරුම් ප්‍රකාශය එය සමාන වීමට තර්කනයට වඩා ඉහළින් තිබිය යුතුය . Postfix - 1 අඩු කරයි, නමුත් සංසන්දනය අඩු කිරීමට පෙර සිට අගය සමඟ සිදු වේ.
uliwitness

4
මේවා සැබවින්ම සමාන වේ. උපසර්ගය භාවිතා කරන්නේ නම් එය වැරදියි: 0 >-- xමෙම අවස්ථාවේ xදී තර්කනයට පෙර අඩු කරනු ලැබේ. පෝස්ට්ෆික්ස් වලදී, තර්කනය අඩු වීමට පෙර ක්‍රියාත්මක වන අතර එමඟින් සාම්පල දෙකම සමාන වේ. ඒවා a හි ලියා Consoleපරීක්ෂා කිරීමට නිදහස් වන්න.
කැන්ඩල්ෂාර්ක්

12
ඔවුන් තවමත් සමාන නොවේ. , X -1 (හෝ එය නිලකුණු වේ නඩුවේ overflown) පළමු පුඩුවක් පසු, පසුව දෙවන, එය 0 වේ (x සෘණ නොවන, ලූප නව්යන x හෝ කඩාගෙන යාම හෝ සිදු ආරම්භ හෝ ... යැයි සිතමු)
සීසර්

1
while(x=x-1,x+1 > 0)සමාන වේ.
එස්එස් ne න්

2
He ෂෙබාම්, මෙන්න ප්‍රතිවිරුද්ධ උදාහරණයකි: x 0 ලෙස ආරම්භ වුවහොත්, මුල් ලූපය යටතේ එය -1 ලෙස පිටව යනු ඇත, ඔබේ අනුවාදය සමඟ එය ශුන්‍ය වේ. එබැවින් ඒවා සමාන නොවේ.
එලියට්

1210

x ප්‍රතිවිරුද්ධ දිශාවට ඊටත් වඩා වේගයෙන් ශුන්‍යයට යා හැකිය:

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

ඊතලයක් මඟින් ඔබට වේගය පාලනය කළ හැකිය!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

;)


6
කුමන මෙහෙයුම් පද්ධතිය, මෙම වර්ගයේ ප්‍රතිදානය ජනනය කර ඇති අතර, මම දෝෂ පණිවිඩයක් ඇති උබුන්ටු 12.04 භාවිතා කරමි
බුවනේෂ්

74
එය පැහැදිලිව පෙනෙන්නට තිබුණත්, C ++ ට අළුත් සෑම කෙනෙකුටම මෙය කියවීම: එය නොකරන්න. ඔබට එකකට වඩා වැඩි කිරීමට / අඩු කිරීමට අවශ්‍ය නම් වැඩි කළ පැවරුම භාවිතා කරන්න.
බ්ලිමියෝ

263
"ලේසර්" සහිත ශුන්‍යය. අතර (0> - - - - - - - - - ---------- x) ... එකම ප්‍රතිදානය.
සැමුවෙල් ඩැනියෙල්සන්

4
ඕෆර්ඩ් එය සම්පාදනය නොකරන බව ඔබට විශ්වාසද? -> coliru.stacked-crooked.com/a/5aa89a65e3a86c98
doc

18
ocdoc එය සම්පාදනය කරන්නේ c ++ වලින්, නමුත් c වලින් නොවේ.
ෆෝර්ඩ්

549

එය

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

අවකාශය මඟින් දේවල් විහිලු, --අඩු වීම හා >සංසන්දනය කරයි.


432

භාවිතය -->historical තිහාසික අදාළත්වයක් ඇත. X86 ගෘහ නිර්මාණ ශිල්පය වැඩි කිරීමට වඩා වේගවත් කිරීම (සහ තවමත් සමහර අවස්ථාවල පවතී). භාවිතා -->කරන බව හඟවන xයන්නේ 0, සහ ගණිතමය පසුබිම් සහිත අය කියා සිටිනවා.


479
හරියටම සත්‍ය නොවේ. අඩු කිරීම හා වැඩි කිරීම එකම කාලයක් ගත වේ, මෙහි ඇති වාසිය නම් විචල්‍යයට සාපේක්ෂව සංසන්දනය හා සසඳන විට ශුන්‍යයට සාපේක්ෂව ඉතා වේගවත් වීමයි. X86 පමණක් නොව බොහෝ ගෘහ නිර්මාණ සඳහා මෙය සත්‍ය වේ. JZ උපදෙස් සහිත ඕනෑම දෙයක් (ශුන්‍ය නම් පනින්න). සංසන්දනය කිරීමේදී චක්‍රයන් සුරැකීම සඳහා පිටුපසට ලියා ඇති “සඳහා” ලූප බොහෝමයක් ඔබ වටා බැලීමෙන් සොයාගත හැකිය. විචල්‍යය අඩු කිරීමේ ක්‍රියාව ශුන්‍ය ධජය නිසි ලෙස සකසා ඇති බැවින් මෙය x86 මත විශේෂයෙන් වේගවත් වේ, එවිට ඔබට විචල්‍යය පැහැදිලිව සංසන්දනය නොකර අතු බෙදිය හැකිය.
burito

25
හොඳයි, බිංදුව දෙසට අඩු වීම යන්නෙන් අදහස් කරන්නේ ඔබ ලූප පුනරාවර්තනයකට 0 ට සමාන කළ යුතු අතර n දෙසට පුනරාවර්තනය කිරීම යනු එක් එක් පුනරාවර්තනය සමඟ n සමඟ සංසන්දනය කිරීමයි. කලින් ඇති දේ පහසු වේ (සමහර ගෘහ නිර්මාණ ශිල්පය මත, සෑම දත්ත රෙජිස්ටර් මෙහෙයුමකින් පසු ස්වයංක්‍රීයව පරීක්ෂා කරනු ලැබේ).
ජෝයි ඇඩම්ස්

9
urburrito මම එකඟ නොවුනත්, ශුන්‍ය නොවන අගයන් මත කොන්දේසි සහිත ලූප සාමාන්‍යයෙන් ආසන්න වශයෙන් පුරෝකථනය කෙරේ.
ඩන්කන්

14
වැඩිවීම හා අඩුවීම සමානව වේගවත් වේ, බොහෝ විට සියලුම වේදිකාවල (අනිවාර්යයෙන්ම x86 මත). වෙනස වන්නේ ලූප් අවසන් තත්ත්වය පරීක්ෂා කිරීමයි. කවුන්ටරය බිංදුවට ළඟා වී ඇත්දැයි බැලීමට ප්‍රායෝගිකව නොමිලේ - ඔබ අගය අඩු කළ විට, ප්‍රොසෙසරයක ශුන්‍ය ධජයක් සකසා ඇති අතර අවසාන තත්වය හඳුනා ගැනීම සඳහා ඔබ එම ධජය පරික්ෂා කළ යුතු අතර ඔබ වැඩි කරන විට අවසන් තත්වයට පෙර සංසන්දනාත්මක මෙහෙයුමක් අවශ්‍ය වේ. හඳුනාගත හැකිය.
lego

7
නවීන සම්පාදකයින්ට ස්වයංක්‍රීයව දෛශික හා ආපසු හැරවිය හැකි බැවින් ඇත්ත වශයෙන්ම මේ දිනවල මේ සියල්ල වැදගත් වේ.
ලැම්බඩා සුරංගනා

367
while( x-- > 0 )

එය විග්‍රහ කරන ආකාරයයි.


363

සම්පූර්ණයෙන්ම ගීක්, නමුත් මම මෙය භාවිතා කරමි:

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

17
@SAFX - එය ඊජිප්තු වරහන්
mouviciel

1
මෙය සම්පාදනය නොකරයි. C යනු පැස්කල් නොවේ, එහි අභ්‍යන්තරය do ... whileප්‍රකාශන ලැයිස්තුවකි. C හි එය බ්ලොක් එකක් බැවින් එය විය යුතුය do { ... } while.
මාර්ක්විස් ඔෆ් ලෝර්න්

25
JEJP එය සම්පාදනය කරයි. වාක්‍ය ඛණ්ඩය වේ do statement while ( expression ) ;. එසේ පැවසීමෙන් පසු, මම ආදර්ශය විහිළුවක් ලෙස අදහස් කර ඇති බව තේරුම් ගත හැකි යැයි මම විශ්වාස කරමි.
Escualo

321

මා කියවූ එක් පොතක් (කුමන පොතදැයි මට නිවැරදිව මතක නැත) ප්‍රකාශ කළේ: සම්පාදකයින් වම් දකුණු රීතිය භාවිතා කරමින් ප්‍රකාශන විශාලතම ටෝකනයට විග්‍රහ කිරීමට උත්සාහ කරයි .

මෙම අවස්ථාවේ දී, ප්රකාශනය:

x-->0

විශාලතම ටෝකන සඳහා විග්‍රහ කිරීම:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

මෙම ප්‍රකාශනයට එකම රීතිය අදාළ වේ:

a-----b

විග්‍රහ කිරීමෙන් පසු:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

සංකීර්ණ ප්‍රකාශනය තේරුම් ගැනීමට මෙය උපකාරී වේ යැයි මම බලාපොරොත්තු වෙමි ^^


98
ඔබේ දෙවන පැහැදිලි කිරීම නිවැරදි නොවේ. සම්පාදකයා දකිනු ඇතa-----b සහ සිතනු ඇත (a--)-- - b, එය සම්පාදනය a--නොකෙරේ.
ටිම් ලීෆ්

22
අමතරව, x සහ --වෙනම කාර්යභාරය අගයනු දෙකක් වේ.
රෝලන්ඩ් ඉලිග්

23
Octor ඩොක්ටර්: එය ලෙක්සර් පසු කරයි. එම දෝෂය විමෝචනය කළ හැක්කේ අර්ථකථන සමත් පමණි. එබැවින් ඔහුගේ පැහැදිලි කිරීම නිවැරදි ය.
v.oddou

9
ඔබ -->ක්‍රියාකරුවෙකු යැයි සිතන තාක් කල් (අසන ලද ප්‍රශ්නය තිබීමෙන් ගම්‍ය වන්නේ එයයි), මෙම පිළිතුර කිසිසේත්ම ප්‍රයෝජනවත් නොවේ - ඔබ සිතන්නේ ටෝකන් 2 යනු -->හුදෙක්ම නොවේ --. -->එය ක්‍රියාකරුවෙකු නොවන බව ඔබ දන්නේ නම් , ඔබට බොහෝ විට ප්‍රශ්නයේ කේතය තේරුම් ගැනීමේ ගැටලුවක් නොමැත, එබැවින් ඔබට සම්පූර්ණයෙන්ම වෙනස් ප්‍රශ්නයක් නොමැති නම්, මෙය ප්‍රයෝජනවත් වන්නේ කෙසේදැයි මට විශ්වාස නැත.
බර්න්හාර්ඩ් බාර්කර්

4
Octor ඩොක්ටර් ටී උදාහරණය නිවැරදි විය හැකි අතර එය aපසු-අඩුකිරීමේ ක්‍රියාකරුට අධික ලෙස පටවා ඇති අතර එය අගය අඩු කරයි. coliru.stacked-crooked.com/a/e1effc351ae79e9f
doc

275

මෙය හරියටම සමාන වේ

while (x--)
{
   printf("%d ", x);
}

සෘණ නොවන සංඛ්‍යා සඳහා


153
මෙය එසේ විය යුතු for(--x++;--x;++x--)නොවේද?
මාටීන් උල්හාක්

9
Octor ඩොක්ටර් unsignedයනු එයයි
කෝල් ජොන්සන්

12
Ate මාටීන් උල්හාක්, ප්‍රමිතියට අනුව එය වැරදියි the1.9.15 අනුව ප්‍රකාශනයේ --x++නිර්වචනය නොකළ හැසිරීම
WorldSEnder

එය භාවිතා කළේ නම්, එය භාවිතා unsignedකිරීමට ඉඩ තිබුණි%u
Cacahuete Frito

242

කෙසේ වෙතත්, අපට දැන් "යන්න" ක්‍රියාකරු ඇත. "-->"දිශාවක් ලෙස මතක තබා ගැනීම පහසු වන අතර “x ශුන්‍යයට යන අතර” යන්න අර්ථය-සෘජු ය.

තවද, එය "for (x = 10; x > 0; x --)"සමහර වේදිකාවලට වඩා ටිකක් කාර්යක්ෂම වේ.


17
X හි අගය .ණාත්මක වන විට සෑම විටම සත්‍ය විය නොහැක.
ගනේෂ් ගෝපාලසුබ්‍රමනියම්

15
අනෙක් අනුවාදය එකම දේ නොකරයි - for (size_t x=10; x-->0; )ලූපයේ සිරුර සමඟ 9,8, .., 0 සමඟ ක්‍රියාත්මක වන අතර අනෙක් අනුවාදය 10,9, .., 1 ඇත. අත්සන් නොකළ විචල්‍යයක් සමඟ ශුන්‍යයට පහළට ලූපයක් පිටවීම තරමක් උපක්‍රමශීලී ය.
පීට් කිර්හැම්

4
මම හිතන්නේ මෙය ටිකක් නොමඟ යවන සුළුයි ... ++>වර්ධක වැඩ කිරීමට අපට තවත් අයෙකු අවශ්‍ය බැවින් අපට වචනාර්ථයෙන් "ක්‍රියාකරු" වෙත නොයනු ඇත.
tslmy

19
Os ජොෂ්: ඇත්ත වශයෙන්ම, පිටාර ගැලීම සඳහා නිර්වචනය නොකළ හැසිරීමක් ලබා දෙයි int, එම නිසා එය සුනඛයා xnegative ණාත්මක ලෙස ආරම්භ වුවහොත් එය බිංදුවට ගෙන යා හැකි තරම් පහසුවෙන් ආහාරයට ගත හැකිය .
SamB

3
EtPeteKirkham විසින් සම්මන්ත්‍රණයේ දී ඇති හේතුව නිසා මෙය මට ඉතා වැදගත් මෝඩකමක් වන අතර, බොහෝ විට අත්සන් නොකළ ප්‍රමාණයන්ට වඩා අඩු ලූප අඩු කිරීමට මට අවශ්‍යය 0. (සංසන්දනය, එවැනි ලියන ලෙස, ශුන්ය සඳහා පරීක්ෂණ සැර බාල කිරීමේ බස් වහරක් සඳහා while (n--)නිලකුණු සඳහා ඒ වෙනුවට n, මිලදී ගැනීම ඔබ කිසිවක් මට විශාල කියවීමේ පහසුව බාධා සඳහා.) ඒ වගේම ඔබ සඳහන් කරන ප්රසන්න දේපළ එකකට සාමාන්යයෙන් දේ වන මූලික දර්ශකය, වඩා ඔබට අවශ්‍යය (උදා: අරාවකට ඉහළින් ඇති ලූපයක් සඳහා ඔබ එහි ප්‍රමාණය නියම කරයි). -->අවකාශය නොමැතිව මමත් කැමතියි , මෙය මෝඩකම පහසුවෙන් හඳුනාගත හැකිය.
මාක් වැන් ලීවන්

221

මෙම කේතය මුලින් x හා 0 සංසන්දනය කර x අඩු වේ. (පළමු පිළිතුරෙහි ද මෙසේ සඳහන් වේ: ඔබ x පසු-අඩුවෙමින් x හා 0 >ක්‍රියාකරු සමඟ සංසන්දනය කරයි .) මෙම කේතයේ ප්‍රතිදානය බලන්න:

9 8 7 6 5 4 3 2 1 0

අපි දැන් පළමුව සංසන්දනය කර ප්‍රතිදානයේ 0 දැකීමෙන් අඩු වේ.

අපට පළමුව අඩු කිරීමට හා පසුව සංසන්දනය කිරීමට අවශ්‍ය නම්, මෙම කේතය භාවිතා කරන්න:

#include <stdio.h>
int main(void)
{
    int x = 10;

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

එම ප්‍රතිදානය:

9 8 7 6 5 4 3 2 1

177

මම මෙම කේතය ක්‍රියාත්මක කරන විට මගේ සම්පාදකයා 9876543210 මුද්‍රණය කරයි.

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

බලාපොරොත්තු වූ පරිදි. මෙම while( x-- > 0 ), ඇත්තෙන්ම while( x > 0). මෙම x--පශ්චාත් decrements x.

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

එකම දේ ලිවීමේ වෙනස් ක්‍රමයකි.

මුල් පිටපත "x 0 ට ගියත්" වගේ පෙනීම සතුටක්.


4
ප්‍රති result ලය නිර්වචනය කරනු ලබන්නේ ඔබ එකම ප්‍රකාශයේ එකම විචල්‍යය එක් වරකට වඩා වැඩි කරන විට / අඩු කරන විට පමණි. මෙම තත්වයට එය අදාළ නොවේ.
ටිම් ලීෆ්

13
while( x-- > 0 ) actually means while( x > 0)- ඔබ එහි කීමට උත්සාහ කළේ කුමක් දැයි මට විශ්වාස නැත, නමුත් ඔබ එය වාක්‍ය ඛණ්ඩනය කළ ආකාරයෙන් ගම්‍ය වන්නේ එහි --කිසිදු අර්ථයක් නොමැති බවයි, එය පැහැදිලිවම ඉතා වැරදිය.
බර්න්හාර්ඩ් බාර්කර්

Uk ඩුකෙලිං වෙතින් ලක්ෂ්‍යය ගෙදර ගෙනයාමට, මෙම පිළිතුර මුල් පෝස්ටයට සමාන නොවේ . මුල් පෝස්ට් එකේ, එය ලූපයෙන් ඉවත් වූ පසු xවනු ඇති -1අතර, මෙම පිළිතුරෙහි, xවනු ඇත 0.
මාර්ක් ලකාටා

148

--සහ අතර ඉඩක් නොමැත >. xපශ්චාත් අඩුවී ඇත, එනම් තත්වය පරීක්ෂා කිරීමෙන් පසුව අඩු x>0 ?වේ.


42
අවකාශය අස්ථානගත වී නැත - සී (++) හිස් අවකාශය නොසලකා හරියි.

27
@ H2CO3 මෙය පොදුවේ සත්‍ය නොවේ. සුදු අවකාශය කාර්යභාරය අගයනු වෙන් කිරීම සඳහා භාවිතා කළ යුතුය ස්ථාන, උදා වේ #define foo()එදිරිව #define foo ().
ජෙන්ස්

30
En ජෙන්ස් කෙසේද: "අවකාශය අතුරුදහන් නොවේ - සී (++) අනවශ්‍ය සුදු අවකාශය නොසලකා හරියි."
කෙවින් පී. රයිස්

139

--යනු අඩු කිරීම් සමාගම සහ >තමයි වැඩි-වඩා ක්රියාකරු.

ක්‍රියාකරුවන් දෙදෙනා තනි එකක් ලෙස යොදනු ලැබේ -->.


11
ඔවුන් වෙනම ක්‍රියාකරුවන් 2 ලෙස යොදනු ලැබේ. ඒවා ලියා ඇත්තේ "තනි එකක්" ලෙස පෙනෙන්නට නොමඟ යවයි.
underscore_d

129

එය ක්‍රියාකරුවන් දෙදෙනෙකුගේ එකතුවකි. පලමු-- අගය අඩු >කිරීම සඳහා වන අතර, අගය දකුණු අතෙහි ක්‍රියාකාරිත්වයට වඩා වැඩි දැයි පරීක්ෂා කිරීම ය.

#include<stdio.h>

int main()
{
    int x = 10;

    while (x-- > 0)
        printf("%d ",x);

    return 0;
}

ප්‍රතිදානය වනුයේ:

9 8 7 6 5 4 3 2 1 0            

122

ඇත්තටම, x පශ්චාත් අඩුවීමක් වන අතර එම තත්වය සමඟ පරීක්ෂා කරනු ලැබේ. එය නෙමෙයි--> , ඒක(x--) > 0

සටහන: xතත්වය පරීක්ෂා කිරීමෙන් පසු එහි අගය වෙනස් වේ. සමහර සමාන අවස්ථා ද සිදුවිය හැකිය, උදාහරණයක් ලෙස:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0

6
ඒ හැර ++> ටික වේලාවකින් භාවිතා කළ නොහැක (). "ඉහළට යයි ..." ක්‍රියාකරු ++ <වනු ඇත, එය කොතැනකවත් ලස්සන නැත. ක්රියාකරු -> ප්රීතිමත් අහඹු සිදුවීමකි.
ෆ්ලෝරියන් එෆ්

2
En බෙන්ලෙගීරෝ එය යමක් කරන කේතයක් ජනනය කිරීමේ අර්ථයෙන් 'ක්‍රියා කළ හැකිය' (ව්‍යාජ-දක්ෂ කේතයට අකමැති පා readers කයින් කෝපයට පත් කරන අතරම), නමුත් අර්ථ නිරූපණය වෙනස් වේ, මන්දයත් එහි පූර්ව නිගමනය භාවිතා කිරීමෙන් අදහස් වන්නේ එය අඩු පුනරාවර්තනයක් සිදු කරනු ඇති බවයි. සංක්ෂිප්ත උදාහරණයක් ලෙස, එය x1 සිට ආරම්භ කළ හොත් එය කිසි විටෙකත් ලූප් බොඩි ක්‍රියාත්මක while ( (x--) > 0 )නොකරනු ඇත. {සංස්කරණය} එරික් ලිපර්ට් ඔහුගේ C # 4 නිකුතු සටහන් දෙකෙන්ම ආවරණය කරයි: blogs.msdn.microsoft.com/ericlippert/2010/04/01/…
underscore_d

120

සී සහ සී ++ "උපරිම මන්ච්" රීතියට අවනත වේ. (a--) - bඔබේ නඩුවේදී --- b පරිවර්තනය කර ඇති ආකාරයටමx-->0 පරිවර්තනය වේ (x--)>0.

රීතිය අත්‍යවශ්‍යයෙන්ම පවසන දෙය නම් වමේ සිට දකුණට ප්‍රකාශන සෑදී ඇත්තේ වලංගු ප්‍රකාශනයක් වන උපරිම අක්ෂර ලබා ගැනීමෙන් ය.


5
OP උපකල්පනය කළේ එයයි: "((අ) ->)" යනු උපරිම මංචකයයි. OP හි මුල් උපකල්පනය වැරදියි: "->" උපරිම වලංගු ක්‍රියාකරු නොවේ.
ඩේවිඩ්

4
මා නිවැරදිව සිහිපත් කළහොත් කෑදර විග්‍රහය ලෙසද හැඳින්වේ.
රෝයි ටින්කර්

1
Oy රෝයිටින්කර් කෑදර ස්කෑන් කිරීම. විග්‍රහකයාට මේ සමඟ කිසිදු සම්බන්ධයක් නැත.
මාර්ක්විස් ඔෆ් ලෝර්න්

27

සියලු සංකූලතා ඇයි?

මුල් ප්‍රශ්නයට සරල පිළිතුර:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x > 0) 
    {
        printf("%d ", x);
        x = x-1;
    }
}

එකම දේ කරයි. ඔබ එය මේ ආකාරයට කළ යුතු යැයි නොකියයි, නමුත් එය එකම දේ කරන අතර එක් පෝස්ට් එකකින් ප්‍රශ්නයට පිළිතුරු දෙනු ඇත.

මෙම x--ඉහත සඳහා පමණක් අයුරෙන් වන අතර, >හුදෙක් සාමාන්ය වැඩි-වඩාoperator . ලොකු අභිරහසක් නැත!

වර්තමානයේ සරල දේවල් සංකීර්ණ කරන බොහෝ අය සිටිති;)


17
මෙම ප්‍රශ්නය සංකූලතා ගැන නොව, C ++ / STL හි සැඟවුණු විශේෂාංග සහ අඳුරු කොන ** ගැන
පික්ස්

20
මෙහි ඇති වැඩසටහන මුල් පිටපතට වඩා වෙනස් ප්‍රතිදානයක් ලබා දෙයි. “සරල පිළිතුරු” සාමාන්‍යයෙන් වැරදි වන්නේ කෙසේද යන්න එයින් මනාව පෙන්නුම් කෙරේ.
i ටයිබ්

2
The OP's way: 9 8 7 6 5 4 3 2 1 0සහThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
ඇන්තනි

2
එය එකම දේ නොකරයි. ඔබේ x=x-1පෙර ගෙනයන්න printfඑවිට ඔබට "එය එකම දේ කරයි" යැයි පැවසිය හැකිය.
CITBL

26

සාම්ප්‍රදායික ක්‍රමයට අපි whileලූප වරහන් ()තුළ ඇති කොන්දේසියක් සහ වරහන් තුළ අවසන් වන තත්වයක් අර්ථ දක්වන්නෙමු {}, නමුත්--> අර්ථ දෙකම එකවරම අර්ථ දක්වන්නෙමු.

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

int abc(void)
{
    int a = 5
    while((a--) > 0) // Decrement and comparison both at once
    {
        // Code
    }
}

මෙය අඩු වන aඅතර aවඩා විශාල වන අතර ලූපය ධාවනය කරයි0 .

සාම්ප්‍රදායිකව එය මෙසේ වනු ඇත:

int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}

ක්‍රම දෙකම, අපි එකම දේ කර එකම අරමුණු සාක්ෂාත් කර ගනිමු.


5
මෙය වැරදිය. ප්‍රශ්නයේ කේතය මෙසේ ය: 'test-write-execute' (පළමුව පරීක්ෂා කරන්න, නව අගයක් ලියන්න, ලූපය ක්‍රියාත්මක කරන්න), ඔබේ උදාහරණය 'test-execute-write' ය.
v010dya

0 v010dya පිළිතුර ස්ථාවර, දැන් එය test-write-executeප්‍රශ්නයේ දී මෙන්, පෙන්වා දීමට ස්තූතියි!
කොටස්කාස්

@VladislavToncharov ඔබේ සංස්කරණය තවමත් වැරදිය. මගේ බලන්න.
එස්එස් ne න්

8

(x --> 0) මාධ්‍යයන් (x-- > 0)

  1. ඔයාට පාවිච්චි කරන්න පුළුවන් (x -->)
    output -: 9 8 7 6 5 4 3 2 1 0

  2. ඔබට භාවිතා කළ හැකි (-- x > 0) එය මධ්යන්ය(--x > 0)
    output -: 9 8 7 6 5 4 3 2 1

  3. ඔයාට පාවිච්චි කරන්න පුළුවන්
(--\
    \
     x > 0)

output -: 9 8 7 6 5 4 3 2 1

  1. ඔයාට පාවිච්චි කරන්න පුළුවන්
(\
  \
   x --> 0)

output -: 9 8 7 6 5 4 3 2 1 0

  1. ඔයාට පාවිච්චි කරන්න පුළුවන්
(\
  \
   x --> 0
          \
           \
            )

output -: 9 8 7 6 5 4 3 2 1 0

  1. ඔබට ද භාවිතා කළ හැකිය
(
 x 
  --> 
      0
       )

output -: 9 8 7 6 5 4 3 2 1 0

ඒ හා සමානව, මෙම විධානය සාර්ථකව ක්‍රියාත්මක කිරීම සඳහා ඔබට බොහෝ ක්‍රම අත්හදා බැලිය හැකිය

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.