printf("%d%d%d \n",++ a,a ++,a)输出

now*_*der 2 c printf

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)

我无法理解该程序的输出(使用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);可以做很多事情; 按照你的预期工作,以你永远无法理解,崩溃,爆炸的方式工作,或者如果感觉特别诙谐,向你的母亲发送讨厌的电子邮件(尽管这种结果通常出现在缓冲区超支和其他此类悲剧中).

你不应该写这样的代码.为了你的家人的缘故.


hag*_*i_e 6

AFAIK没有为函数调用的参数定义评估顺序,结果可能因每个编译器而异.在这个例子中,我可以猜测中间参数首先被评估,然后是第一个和第三个.

  • 在函数调用中分隔参数的逗号不是逗号运算符,它只是语法的一部分:`foo(a,b)` - 这不是逗号运算符; `x = a,b` - 这是一个逗号运算符. (7认同)
  • 是的,依赖任何给定的评估顺序是一个常见的错误.它今天使用这个编译器,然后它停止在另一个编译器上工作. (2认同)