我无法理解该程序的输出(使用gcc).
main()
{
int a=10;
printf("%d %d %d\n",++a, a++,a);
}
Run Code Online (Sandbox Code Playgroud)
输出:
12 10 12
Run Code Online (Sandbox Code Playgroud)
另外,请解释评论的顺序printf().
Car*_*ers 11
编译器将printf按照当时的感觉顺序评估参数.它可能是一个优化的东西,但不能保证:它们被评估的顺序不是由标准指定的,也不是实现定义的.没有办法知道.
但是,什么是由标准的规定,是在一个操作中修改同一个变量两次是未定义的行为; ISO C++ 03,5 [expr]/4:
在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.
printf("%d %d %d\n",++a, a++,a);可以做很多事情; 按照你的预期工作,以你永远无法理解,崩溃,爆炸的方式工作,或者如果感觉特别诙谐,向你的母亲发送讨厌的电子邮件(尽管这种结果通常出现在缓冲区超支和其他此类悲剧中).
你不应该写这样的代码.为了你的家人的缘故.
AFAIK没有为函数调用的参数定义评估顺序,结果可能因每个编译器而异.在这个例子中,我可以猜测中间参数首先被评估,然后是第一个和第三个.