关于(i++) + (++i)的结果和类似问题
在这里, 我可以很明确告诉大家结果无定义, 什么结果看编译器
原因是C/C++标准不对除了某些运算符之外的其他运算符操作数的求值顺序作规定
(i++) + (++i)
也就是说编译器可以任意选择, 先算i++或者先算++i, 再相加求值
类似问题还有
int f() { return 1; }
int g() { return 2; }
printf("%d, %d", f(), g());
这个的输出是什么? 1, 2还是2, 1?
答案是: 都有可能
虽然参数压栈顺序是从右到左, 但是求值顺序仍然没有定义, 所以编译器可以先执行f()再执行g()或者先执行g(), 再执行f()
明确定义有求值顺序的操作符有:
&&(左操作数先求值)
||(同上)
,
? :
逗号操作符合三目运算符的? :操作符的具体求值顺序忘了, 大家可以自己查查, 不排除我遗漏了某个操作符的可能性
上面的内容有一些错误
int f()
{ printf("f()"); return 1;}
int g()
{ printf("g()"); return 2; }
上面的f()和g()应该是这样的
输出是无明确定义的 类似问题还有
int f() { return 1; }
int g() { return 2; }
printf("%d, %d", f(), g());
这个的输出是什么? 1, 2还是2, 1?
答案是: 都有可能
楼主不懂不要乱说
这里绝对会输出 1, 2
没有第二种可能
不管是 f()先调用 还是 g先调用
f先调用 会变成这样
printf(..... 1, g());
然后
printf(.... 1, 2);
如果是g先调用
那就是
printf(..... f(), 2);
然后
printf(..... 1, 2);
结果都是 一样的 对于 2# 的纠正
那也只是 先输出 f() 还是 先输出 g() 无法确定
最终输出 1, 2 这个是不会有区别的
页:
[1]