用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的值,从而导致未定义的行为。