commas in C - can you pass the puzzle ?
In a recent Deep-C training course in Bangalore
I was discussing sequence points with some C programmers.
I explained that the comma operator is one the very few operators that creates a sequence point.
I like the comma. It's the name of a beautiful butterfly. K&R's famous Hello World program had a comma between hello and world. I should really put a comma into my blog picture!
During several cyber-dojos it became clear to me that many of the programmers (despite having programmed in C for several years), did not understand that in C, not all commas are the same. I've created a small piece of C code to try help C programmers understand the humble comma...
Have a look at the following 5 lines of code. Do you know what each line does?
.
.
.
.
.
Scroll down for my answers once you've decided...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
This declares an
This is different. If this compiled it would declare an
In this fragment
Again,
Again,
How did you do?
During several cyber-dojos it became clear to me that many of the programmers (despite having programmed in C for several years), did not understand that in C, not all commas are the same. I've created a small piece of C code to try help C programmers understand the humble comma...
Have a look at the following 5 lines of code. Do you know what each line does?
int x = (1,2,3); int x = 1,2,3; x = 1,2,3; x = (1,2,3); x = f(1,2,3);.
.
.
.
.
.
Scroll down for my answers once you've decided...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
int x = (1,2,3);
This declares an
int called x and initializes it to the result of the expression
(1,2,3). The commas inside this expression are operators.
1 is evaluated and its value (1) discarded,
then a comma provides a sequence point, then 2 is evaluated and its value (2) discarded,
then a comma provides a sequence point, then 3 is evaluted and its value is the value of the
expression (1,2,3). So x is initialized to 3.
You'll probably get warnings saying there are no side-effects in the expressions 1 and 2.
int x = 1,2,3;
This is different. If this compiled it would declare an
int called x
and initialize it to 1 and then declare two more ints called 2
and 3. It has the same structure as int x = 1,y,z; which declares three
ints called x, y, and z.
The commas are not operators, they are punctuators/separators.
You can't declare variables called 2 or 3. It does not compile.
x = 1,2,3;
In this fragment
x is assumed to have already been declared. It is not a declaration. The
commas are operators again.
Assignment has higher precedence than the comma operator so this binds as (x = 1),2,3;.
So 1 is assigned to x, and the result of this assignment expression (1) is discarded,
then there is a sequence point, then 2 is evaluated and its value (2) is discarded,
then there is a sequence point, then 3 is evaluated and its value (3) is discarded.
You'll probaby get warnings saying there are no side-effects in the expressions 2 and 3.
x = (1,2,3);
Again,
x is assumed to have already been declared. It is not a declaration.
The commas are operators again. This is the same as the first fragment except it is not
a declaration. x is assigned the value of the expression (1,2,3)
which is 3. Again you'll probably get warnings saying there are no side-effects in the expressions 1 and 2.
x = f(1,2,3);
Again,
x is assumed to have already been declared. As has a function called
f which accepts three int arguments. These commas are
not operators. They are punctuators/separators. They separate the three expressions
forming the three arguments to f. But they do not introduce any sequence points.
How did you do?
Subscribe to:
Comments (Atom)