Skirtingas kablelio operatoriaus elgesys C + + su grąžinimu?

Tai (atkreipkite dėmesį į kablelio operatorių ):

 #include <iostream> int main() { int x; x = 2, 3; std::cout << x << "\n"; return 0; } 

rodo 2 .

Tačiau, jei naudosite return su kablelio operatoriumi, tai yra:

 #include <iostream> int f() { return 2, 3; } int main() { int x; x = f(); std::cout << x << "\n"; return 0; } 

rodo 3 .

Kodėl kablelio operatorius return veikia kitaip?

74
07 сент. rinkinys prakharsingh95 07 sept. 2016-09-07 10:56 '16 at 10:56 2016-09-07 10:56
@ 4 atsakymai

Pagal operatoriaus prioritetą operatoriaus kablelis yra mažesnis prioritetas nei operator= , todėl x = 2,3; yra lygus (x = 2),3; . (Operatoriaus prioritetas nustato, kaip operatorius bus susietas su jo argumentais, kurie pagal jų prioritetus yra sunkesni ar silpnesni nei kiti operatoriai.)

Atkreipkite dėmesį, kad čia yra kablelio (x = 2),3 išraiška, o ne 2,3 . Pirma, apskaičiuojamas x = 2 (ir jo šalutinis poveikis yra baigtas), tada rezultatas yra atmestas, tada 3 įvertinamas (jis iš tikrųjų nieko nedaro). Todėl x reikšmė yra 2 . Atkreipkite dėmesį, kad 3 yra viso kablelio išraiška (t.y. x = 2,3 ), ji nebus naudojama priskirti x . (Pakeiskite jį į x = (2,3); x bus priskirtas 3 )

return 2,3; įvertinama kablelio išraiška 2,3 , 2 , tada jo rezultatas yra atmestas, o tada 3 įvertinamas ir grąžinamas kaip viso kablelio išraiška, kuri vėliau grąžinama į grąžinimo ataskaitą .


Papildoma informacija apie išraiškas ir pareiškimus

Išraiška yra operatorių ir jų operandų seka, kuri nurodo skaičiavimą.

x = 2,3; išraiškos išraiška , x = 2,3 yra čia.

Išraiška, po kurios yra kabliataškis, yra išraiška.

Sintaksė: attr(optional) expression(optional) ; (1) attr(optional) expression(optional) ; (1)

return 2,3; grąžinimo ataskaita , 2,3 yra čia.

Sintaksė: attr(optional) return expression(optional) ; (1) attr(optional) return expression(optional) ; (1)

129
07 сент. atsakymas duotas Songyuanyao 07 Sep 2016-09-07 10:58 '16 at 10:58 2016-09-07 10:58

Kablelio operatorius (dar vadinamas atrankos operatoriumi) vertinamas iš kairės į dešinę. Taigi, return 2,3; return 3; .

Įvertinimas x = 2,3; lygus (x = 2), 3; dėl operatoriaus prioriteto. Rezultatas išlieka į dešinę, o visa išraiška turi reikšmę 3 su x šalutiniu poveikiu, darant prielaidą, kad vertė yra 2.

30
07 сент. atsakymas pateikiamas Bathsheba 07 sep . 2016-09-07 10:59 '16 at 10:59 2016-09-07 10:59

Šis pareiškimas:

  x = 2,3; 

susideda iš dviejų terminų:

 > x = 2 > 3 

Kadangi operatoriaus prioritetas yra = prioritetas yra didesnis už kablelį, todėl x = 2 įvertinamas po 3 . Tada x bus lygus 2 .


Vietoj return :

 int f(){ return 2,3; } 

Kalbos sintaksė:

 return <expression> 

Pastaba return nėra išraiška.

Taigi šiuo atveju bus vertinamos dvi išraiškos:

 > 2 > 3 

Tačiau tik antrasis bus grąžintas ( 3 ).

19
07 сент. Atsakymas, kurį pateikė Biagio Festa 07 Sep. 2016-09-07 11:03 '16 at 11:03 2016-09-07 11:03

Išbandykite supaprastintą metodą, tiesiog pirmenybę teikdami skliausteliuose:

( x = 2 ), 3;

return ( 2, 3 );

Dabar matome, kad dvejetainis operatorius "," veikia abiejuose, iš kairės į dešinę.

2
15 сент. Luciano rugsėjo 15 d. atsakymas 2016-09-15 16:58 '16 at 16:58 pm 2016-09-15 16:58