用C编程语言执行printf()函数中的参数

在解决C编程语言的一些能力问题时,我遇到了一个问题,我必须告诉输出。 该计划是: –

#include int main() { int x = 5; printf("%d %d %d", ++x, x++, ++x); return 0; } 

根据我之前的知识,我知道printf()函数的参数是从右到左计算的。 所以手动解决这个问题我得到的输出为: – 8 6 6

但是当我编译这个程序时,我得到的输出为: – 8 6 8

好的,这个问题似乎与这个问题有点相关,但是,我特别要求在函数中执行参数而不是为赋值运算符执行。

或者参数的执行是随机发生的吗? 如果是这样,那么有一段时间它应该给出一些不同的输出,但它没有给出。 即使在不同的编译器上,它也提供与8 6 8相同的输出。

为什么这个exception?

谢谢

printf()的求值顺序不是您所假设的那样。 评估订单未指定

从C11草案(附件J,未指明的行为)

在函数调用中评估参数中函数指示符,参数和子表达式的顺序(6.5.2.2)。

从3.4.4开始,未指明的行为

使用未指定的值或本国际标准提供两种或更多种可能性的其他行为,并且在任何情况下都不会对其进行任何进一步的要求。

示例未指定行为的示例是评估函数参数的顺序。

因此,可以按任何顺序评估三个x++表达式。 但是这会导致未定义的行为,因为您试图在没有插入序列点的情况下多次修改同一个对象。 函数指示符中的逗号是分隔符 ,而不是逗号运算符 。 因为逗号运算符确实在其操作数之间引入了一个序列点。

行为肯定是意外的,您不应该在函数调用中多次更改变量的值。 序列点规则。 试着看看这个链接 。 并且还阅读程序中的序列点

只是尝试在函数调用中不要多次更改一个变量的值

这里有两件事干扰:

  • 函数参数的评估顺序是未定义的(导致未定义的结果) – >订单可以是任何东西,因为没有标准强加的订单(标准说明:订单未指定)
  • 函数参数的评估之间没有序列点。 (函数调用本身,它的返回序列点,但这与此无关)

这在实践中意味着什么:因为函数参数的评估具有副作用(增量),所以有多次尝试在没有插入序列点的情况下改变x的值,从而导致未定义的行为。