C中赋值表达式的结果是啥? [复制]
Posted
技术标签:
【中文标题】C中赋值表达式的结果是啥? [复制]【英文标题】:What is the result of an assignment expression in C? [duplicate]C中赋值表达式的结果是什么? [复制] 【发布时间】:2013-05-10 04:14:40 【问题描述】:在以下代码中:
int c;
while((c=10)>0)
c = 10
的评估结果是什么?是 1 表示将值 10 分配给变量 c 成功,还是 10?为什么?
【问题讨论】:
【参考方案1】:c = 10 是一个返回 10 的表达式,它也将 10 分配给 c。
【讨论】:
如果将 10 分配给 c,但 c = 10 是否应该返回 1? 这样不好,想想 a = c = 10;你不希望 a 是 10,而不是 1? @user2131316: 表达式c = 10
在赋值后具有c
的值(N1570, 6.5.15/3)。赋值表达式不是布尔表达式。
它不返回 10,它返回 c
,第一次调用时为 10。不同之处在于c
的值很可能会在while
块中发生变化。【参考方案2】:
据说在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.
【讨论】:
最佳答案 - 清晰、准确、简短 跟进@martinkunev的回答:这个回答也更好,因为它直接引用了标准,更直接地谈到了表达式值的类型的问题,它与左边的类型匹配-手操作数。 (考虑 a=b=c 其中 a 和 c 是 unsigned int 和 b 是无符号短。) 这也意味着int x = 10; int y = (x += 1);
的结果是x = 11, y = 11
,不是 x = 11, y = 1
。【参考方案3】:
赋值返回赋值。如果c=10
是 10。由于 10!=0,在 c 中它也意味着 true,所以这是一个无限循环。
这就像你会写
while(10)
另外你已经完成了任务。
如果你按照这个逻辑,你可以看到,那
while(c=0)
将是一个从不执行其语句或块的循环。
【讨论】:
【参考方案4】:while((c=10)>0)
c = 10
should 返回10
。
现在,对于 while(10>0)
10>0
,>
运算符返回 1
(非零值)。
【讨论】:
【参考方案5】:这是一个无限循环。它首先将 10 分配给 c,然后将其与 c > 0 进行比较,然后再次开始循环,将 10 分配给 c,将其与 c>0 进行比较,依此类推。循环永远不会结束。这等效于以下内容:
while(c=10);
/* Because c assign a garbage value, but not true for all cases maybe it assign 0 */
while(c);
编辑:它不会返回 10,因为编译器只返回 true 或 false 值,所以它返回 true 或 1 而不是 10。
【讨论】:
为什么c会被赋值为垃圾值? 因为它还没有初始化,编译器会自动为其分配一些值。因为内存中的所有地址在初始化之前都有一些值c = 10
会不会将值10
分配给c
?
它在第一个语句而不是第二个语句中将 10 分配给 c
哦,我以为是一个块以上是关于C中赋值表达式的结果是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
C语言问题 赋值表达式返回值是啥?比如j=0这个表达式的返回值是啥?