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?

Was dit nuttig?

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.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top