C 当a=1时,a、a++、++a的输出是多少;

C 当a=1时,a、a++、++a的输出是多少;,c,C,有谁能解释一下下面代码输出背后的正确逻辑吗 #include <stdio.h> int main() { int a=1; printf("%d\t%d\t%d\n",a,a++,++a); return 0; } 预期输出是3 2 3您的代码是,因此没有正确的逻辑,它可以输出0 0、1 1 2、hello、world或emit 发件人: 第6.5节第2段: 在上一个序列点和下一个序列点之间

有谁能解释一下下面代码输出背后的正确逻辑吗

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

您的代码是,因此没有正确的逻辑,它可以输出0 0、1 1 2、hello、world或emit

发件人:

第6.5节第2段:

在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的计算修改一次。此外,之前的值应为只读,以确定要存储的值

第6.5.2.2节第10段:

函数指示符、实际参数和实际参数中的子表达式的求值顺序未指定,但在实际调用之前有一个序列点


输出为:UB参数的评估未指定!在输出未定义之前,这个问题被问了很多次behavior@Rizier123在c语言中,参数的计算是从右向左的。@AustinPhilipD'silva,@Rizier123:不,参数的计算在这里没有定义。请参阅C99标准、6.5p2和6.5.2.2p10。@AustinPhilipD'silva:C没有指定参数的计算为R-to-L。在许多实现中,它是R-to-L,因为这样更容易管理堆栈。但这不是必须的,也不是保证的。我得到的答案是3 2 3!!!。据我所知,在C语言中,printf的调用约定是从右到左。@AustinPhilipD'silva:请参阅我的编辑。@AustinPhilipD'silva:另外,如果是从右到左,您应该得到3 2。因为您首先要计算++ato 2,然后是a++到2,但在此过程中将其增加到3,然后是a到3。@Rizier123:6.5p2使其未定义。如果您想知道,未定义意味着非法,编译器供应商不必以任何方式处理错误,未指定意味着编译器供应商必须从一组选项中选择一种方式,但不必记录他们选择的内容。您还定义了实现,这与此类似,但必须记录选择。