- y = 2 + (x += x++, x + 8, ++x);
复制代码
1. 这个先计算 x += x++,得出一个未定义的结果
2. 然后计算 x + 8,这个表达式没有副作用,没有修改任何变量
3. 然后计算 ++x
4. 然后计算 y = 2 + (上一步++x的值)
第1步的结果未定义,就是不知道执行完x += x++后,x中保存的值是什么
第3步给 第1步得到的那个未定义的结果加1
如果第1步执行x += x++后得到的结果是1,那么这里 ++x后,x的值就变成了2
不要怀疑,既然是未定义的结果,为什么这个结果不能是1 ?
什么是未定义?
未定义就是标准没有规定这样的代码应该给出什么结果,交给编译器的设计者来决定
所以,如果第1步x += x++的结果是0,第3步执行完了结果就是1
如果第1步x += x++的结果是-1,第3步执行完了结果就是0
如果第1步x += x++的结果是64,第3步执行完了结果就是65
如果第1步x += x++的结果是520,第3步执行完了结果就是521
如果第1步x += x++的结果是250,第3步执行完了结果就是251
如果第1步x += x++的结果是1024,第3步执行完了结果就是1025
具体第1步会给出的结果是多少,这是真的不知道,不同的编译器很有可能给出不一样的结果,也可能给出一样的结果
就和下面这样的代码一样,你知道下面这个代码输出什么吗?不同的编译器很有可能不一样,当然也可以一样
- #include <stdio.h>
- int main(void) {
- int x;
- printf("%d\n", x);
- return 0;
- }
复制代码
这就是代码的未定义行为,会得到什么结果都是可能的