Inside a while loop, is the last comma separated statement guaranteed to run last?
Asked Answered
A

3

12

Consider the following (trivial) code segment:

while (i++, i <= 10) {
  // some more code
}

In the general case, C++ allows comma separated statements to be evaluated in any order. In the case of a while loop, are we at least guaranteed (by the specification) that the last statement (which is used as the condition for the loop) be evaluated last?

Aguiar answered 1/11, 2010 at 19:57 Comment(5)
I suppose this is beside your point, but just in case: You could rewrite that condition as i++ <= 10 and get rid of the comma operator. Now go and tell me that this is beside your point. :)Fatal
@Fatal - does that do the same thing? I would have expected that with prefix but not postfix. ie. ++i, i<= 10 is the same as ++i <= 10Landscape
@Steve: You got me there. Yes, it should be ++i <= 10. Sorry for that. (I really shouldn't attempt to do that while chatting.)Fatal
@Fatal - np, I am still hugely in your debt for prior work here.Landscape
@Fatal - I find a lot of good info in your Stack Overflow answersLandscape
C
20

In the general case, C++ allows comma separated statements to be evaluated in any order.

If you're referring to the commas between function arguments, that's just a separator.

In your case, you're using the comma operator, and that introduces a sequence point that guarantees that all side-effects from the comma's left operand have settled down before evaluating the right one.

So yes, it is well-defined.

From section 5.18/1 of the ISO C++98 standard:

A pair of expressions separated by a comma is evaluated left-to-right and the value of the left expression is discarded. The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are not applied to the left expression. All side effects (1.9) of the left expression, except for the destruction of temporaries (12.2), are performed before the evaluation of the right expression. The type and value of the result are the type and value of the right operand; the result is an lvalue if its right operand is.

Compossible answered 1/11, 2010 at 20:0 Comment(0)
M
11

Yes. The , operator (unless overloaded!) introduces a so-called sequence point and does indeed guarantee the order of execution from left to right.

Marsiella answered 1/11, 2010 at 19:59 Comment(1)
...and notably the context (as in in the while condition) doesn't matter to the above statement.Tildie
H
5

The above comments explained it. And one of the common way of abusing this method is

while(scanf("%d", &n), n){
    // do something
}

This will read integer until we read zero.

Hames answered 22/2, 2014 at 20:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.