C++: Multiple exit conditions in for loop (multiple variables): AND -ed or OR -ed?

31,395

Solution 1

The comma operator will return the value of the right expression, so writing this:

 src < 8, dst >= 0;

As a condition will be the same as just writing dst >= 0. The src < 8 will be completely ignored in this case, as it's evaluated separately from the second condition, and then the second condition is returned. This doesn't evalute to AND or to OR, but in fact just has the effect of "throwing away" the first check entirely.

If you want to evaluate this correctly, you should use one of your two options (explicitly specifying the behavior via || or &&).

For details, see Comma Operator:

When the set of expressions has to be evaluated for a value, only the rightmost expression is considered.

Solution 2

The comma operator evaluates the first expression and discards the result. Then it evaluates the second and that is what is the value tested in the if. You will find that your condition is not && nor || but behaves exactly like if(dst >= 0). Sometimes the form is useful for changing a value at the end of a loop before the test is carried out.

Solution 3

There is even warning about it with -Wall enabled:

ILI9341.cpp:711:28: warning: left operand of comma operator has no effect [-Wunused-value]
   for(int j = x, jj = 0; j < fbw, jj < w; ++j, ++jj)
                          ~~^~~~~
Share:
31,395

Related videos on Youtube

FreelanceConsultant
Author by

FreelanceConsultant

No longer available for hire for contract work Expertise include: Research (Any) Data Analysis, Signal Processing Mathematics C, C++ and Python Multi-thread, parallel and networked CUDA, OpenCL

Updated on August 31, 2021

Comments

  • FreelanceConsultant
    FreelanceConsultant over 2 years

    For loops and multiple variables and conditions.

    I am using a for loop to set source and destination indexes to copy items in an array.

    for(int src = 0, dst = 8;
        src < 8, dst >= 0;
        src ++, dst --)
    {
        arr2[dst] = arr1[src];
    }
    

    Something like that anyway.

    (AND) || (||)

    My question is about the exit conditions. There are two here. src < 8 and dst >= 0. Are these conditions AND-ed (&&) or OR-ed (||).

    To further explain, are the conditions evaluated like this:

    (src < 8) && (dst >= 0)
    

    Or are they evaluated like this?

    (src < 8) || (dst >= 0)
    

    Or is it something else entirely different? I imagine the logical thing to do would be to evaluate one of the two ways I specified above, and not something else.

  • FreelanceConsultant
    FreelanceConsultant almost 11 years
    Oh well look at that, not what I expected at all! Thanks, I'll go and fix my code...