4.10. Comma Operator
The comma operator takes two operands, which it evaluates from left to right. Like the logical AND and logical OR and the conditional operator, the comma operator guarantees the order in which its operands are evaluated.
INFO
Exercises Section 4.9
Exercise 4.28: Write a program to print the size of each of the built-in types.
Exercise 4.29: Predict the output of the following code and explain your reasoning. Now run the program. Is the output what you expected? If not, figure out why.
int x[10]; int *p = x;
cout << sizeof(x)/sizeof(*x) << endl;
cout << sizeof(p)/sizeof(*p) << endl;
Exercise 4.30: Using Table 4.12 (p. 166), parenthesize the following expressions to match the default evaluation:
(a)sizeof x + y
(b)sizeof p->mem[i]
(c)sizeof a < b
(d)sizeof f()
The left-hand expression is evaluated and its result is discarded. The result of a comma expression is the value of its right-hand expression. The result is an lvalue if the right-hand operand is an lvalue.
One common use for the comma operator is in a for
loop:
vector<int>::size_type cnt = ivec.size();
// assign values from size... 1 to the elements in ivec
for(vector<int>::size_type ix = 0;
ix != ivec.size(); ++ix, --cnt)
ivec[ix] = cnt;
This loop increments ix
and decrements cnt
in the expression in the for
header. Both ix
and cnt
are changed on each trip through the loop. As long as the test of ix
succeeds, we reset the next element to the current value of cnt
.
INFO
Exercises Section 4.10
Exercise 4.31: The program in this section used the prefix increment and decrement operators. Explain why we used prefix and not postfix. What changes would have to be made to use the postfix versions? Rewrite the program using postfix operators.
Exercise 4.32: Explain the following loop.
constexpr int size = 5;
int ia[size] = {1,2,3,4,5};
for (int *ptr = ia, ix = 0;
ix != size && ptr != ia+size;
++ix, ++ptr) { /* ... */ }
Exercise 4.33: Using Table 4.12 (p. 166) explain what the following expression does:
someValue ? ++x, ++y : --x, --y