2015-02-05 127 views
-6

任何人都可以请解释我后面的代码输出后面的正确逻辑。当a = 1时,a,a ++,++ a的输出是什么;

#include <stdio.h> 
int main() 
    { 
      int a=1; 
      printf("%d\t%d\t%d\n",a,a++,++a); 
      return 0; 
    } 

预期输出是3 2 3

+1

输出是:'UB'参数的评估是未指定的! (这个问题之前被问了很多次) – Rizier123 2015-02-05 13:00:09

+0

输出是undefined行为 – karthikr 2015-02-05 13:01:19

+0

@ Rizier123在c中的参数评估是从右到左这里。 – 2015-02-05 13:02:22

回答

3

您的代码是undefined behavior,所以为 “正确的逻辑” 为它---它可以输出0 0 01 1 2hello, world,或发出nasal demons没有这样的事。

C99 standard

  • 第6.5节,第2段:

    之前和下一序列点之间的对象应具有其存储的值由表达式的评估修饰的至多一次。此外,先验值只能读取以确定要存储的值。

  • 第6.5.2.2节,第10段:

    功能标志的评估顺序,实际参数中的实际参数,子表达式是不确定的,但前一个序列点实际的通话。

+0

我的答案是3 2 3 !!! – 2015-02-05 13:05:58

+0

据我记得在C调用约定是从右到左的printf。 – 2015-02-05 13:07:29

+0

@ AustinPhilipD'silva:看我的编辑。 – 2015-02-05 13:09:34

相关问题