C语言中相同自增操作输出不同?赋值与输入场景差异解析请求
为什么相同自增操作对初始化变量和输入变量结果不同?
先看你的测试代码:
#include <stdio.h> int main(void) { int a,b,c,d; a=5; scanf("%d",&d); b=(++a)+(++a); printf("changed declared value = %d operated value = %d\n",a,b); c=(++d)+(++d); printf("changed input value= %d operated value= %d ",d,c); return 0; }
你遇到的核心问题是:(++x)+(++x)这种表达式属于C语言的未定义行为,不管变量是直接赋值还是输入得到的,结果都没有统一标准,出现差异是完全正常的。
C语言标准明确规定:在一个序列点(比如语句末尾的分号、逗号运算符、逻辑与/或运算符等)之前,如果同一个变量被多次修改,或者既被修改又被读取(读取的目的不是为了计算要修改的值),程序的行为就是未定义的。
放到你的代码里,(++a)+(++a)中两个++a都会修改a的值,而且它们之间没有序列点,编译器可以自由选择求值顺序:
- 可能先执行两次
++a,再把两次结果相加,此时a变成7,结果是14; - 也可能先执行左边的
++a(a变为6),再执行右边的++a(a变为7),然后相加得到13; - 甚至在不同优化等级下,编译器还可能给出其他结果。
你看到a和d的结果不同,只是因为编译器处理这两个变量时的策略不一样:a是编译期就能确定值的变量,编译器可能做了常量折叠之类的优化;而d是运行期输入的变量,编译器只能按运行时的求值逻辑处理。但这两种情况都属于未定义行为的范畴,标准没有要求它们必须产生相同结果。
总结:这种依赖求值顺序的代码完全不可靠,永远不要写。
内容的提问来源于stack exchange,提问作者Shivani Singh
相关产品推荐
相关产品推荐

