Binne 'n rukkie loop, is die laaste komma geskei verklaring gewaarborg laaste uit te voer?
-
28-09-2019 - |
Vra
Oorweeg die volgende (triviale) kode segment:
while (i++, i <= 10) {
// some more code
}
In die algemene geval, C ++ kan deur kommas geskei state te evalueer in enige volgorde. In die geval van 'n while lus, is ons ten minste gewaarborg (deur die spesifikasie) wat die laaste stelling (wat gebruik word as die voorwaarde vir die lus) word geëvalueer laaste?
Oplossing
In die algemene geval, C ++ kan deur kommas geskei state te evalueer in enige volgorde.
As jy verwys na die kommas tussen funksie argumente, dit is net 'n separator.
In jou geval, jy gebruik die komma operateur , en dat stel 'n reeks punt wat waarborg dat al newe-effekte van die komma's links operand het voor die evaluering van die regte een vereffen.
So ja, is dit goed gedefinieerde.
Van afdeling 5.18 / 1 van die ISO C ++ 98 standaard:
'n paar uitdrukkings geskei deur 'n komma is geëvalueer links na regs en die waarde van die linker uitdrukking is weggegooi. Die lvalue-tot-rvalue (4.1), array-tot-wyser (4.2), en funksie-tot-wyser (4.3) standaard doelskoppe is nie van toepassing op die linker uitdrukking. Alle newe-effekte (1.9) van die linker uitdrukking, behalwe vir die vernietiging van temporaries (12.2), het hulle gehou voor die evaluering van die reg uitdrukking. Die tipe en waarde van die gevolg is van die tipe en waarde van die reg operand; die resultaat is 'n lvalue as sy reg operand is.
Ander wenke
Ja. Die ,
operateur (tensy oorlaai!) Stel 'n sogenaamde volgorde punt en inderdaad die einde van die uitvoering waarborg van links na regs.
Die bogenoemde kommentaar verduidelik dit. En een van die algemene manier van die misbruik van hierdie metode is
while(scanf("%d", &n), n){
// do something
}
Dit sal lees heelgetal totdat ons lees nul.