What is the result of an assignment expression in C? [duplicate]
Asked Answered
C

5

18

In the following code:

int c;
while((c=10)>0)

What does c = 10 evaluate to? Is it 1 which indicates that the value 10 is assigned to variable c successfully, or is it 10? Why?

Clerissa answered 15/5, 2013 at 14:21 Comment(0)
K
19

c = 10 is an expression returning 10 which also assigns 10 to c.

Kan answered 15/5, 2013 at 14:23 Comment(4)
if it assigns 10 to c, but should c = 10 return 1?Clerissa
That would not be nice, think about the statement a = c = 10; Wouldn't you want a to be 10, not 1?Kan
@user2131316: the expression c = 10 has the value of c after the assignment (N1570, 6.5.15/3). Assignment expressions are not Boolean expressions.Edom
It doesn't return 10, it returns c which is 10 for the first call. The difference is that the value of c will most likely change in the while block.Colligate
E
14

It is said in C99 6.5.16

An assignment operator stores a value in the object designated by the left operand. An        
assignment expression has the value of the left operand after the assignment, but is not an 
lvalue.
Euonymus answered 30/8, 2014 at 3:8 Comment(3)
Best answer - clear, precise and shortSalmonberry
To follow up @martinkunev's answer: this answer is also better because it references the standard directly, and more directly speaks to the question of the type of the expression's value, which matches the type of the left-hand operand. (Consider a=b=c where a and c are unsigned int and b is unsigned short.)Kayne
This also means that int x = 10; int y = (x += 1); results in x = 11, y = 11, not x = 11, y = 1.Phototelegraph
S
2

Assignment returns with the assigned value. In case c=10 is 10. Since 10!=0, in c it means also true so this is an infinite loop.

It is like you would write

while(10)

Plus You've made the assignment.

If You follow this logic, You can see, that

while(c=0)

would be a loop that never executes its statement or block.

Salish answered 15/5, 2013 at 14:22 Comment(0)
I
1

This is an infinite loop. It first assign 10 to c, then compare it with c > 0, then again loop starts, assign 10 to c, compare it with c>0 and so on. Loop never ends. This is equivalent to the following:

while(c=10);

/* Because c assign a garbage value, but not true for all cases maybe it assign 0 */
while(c); 

Edit: It will not return 10 because compiler return only true or false value, so it return true or 1 instead of 10.

Inextirpable answered 15/5, 2013 at 14:25 Comment(5)
Why will c be assigned a garbage value?Sharla
cause it's not initialized yet and compiler automatically assign some value to this. As all addresses in memory have some value before it initializedInextirpable
c = 10 will it not assign the value 10 to c?Sharla
It assign 10 to c in 1st statement not in secondInextirpable
Oh, I thought its one single blockSharla
S
1
while((c=10)>0)

c = 10 should return 10.

Now, for while(10>0) 10>0, the > operator returns 1 (non-zero value).

Sharla answered 15/5, 2013 at 14:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.