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

时间:2015-12-08 12:15:45

标签: c

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

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

根据我之前的知识,我知道printf()函数的参数从右到左进行评估。因此,手动解决此问题,我得到的输出为: - 8 6 6

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

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

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

为什么会出现这种异常现象?

由于

3 个答案:

答案 0 :(得分:3)

printf()中的评估顺序并非如您所假设的那样从左到右。评估顺序是未指定

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

  

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

From,3.4.4,未指明的行为

  

使用未指定的值或其他行为   国际标准提供两种或更多种可能性和强加   在任何情况下都没有选择进一步的要求。

     

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

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

答案 1 :(得分:1)

这里有两件事情在干扰:

  • 函数参数的评估顺序未定义(导致未定义的结果) - &gt;订单可以是任何东西,因为标准没有订单(标准说明:订单未指定)
  • 在函数参数的评估之间存在 no 序列点。 (函数调用本身,它的返回序列点,但这里不相关)

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

答案 2 :(得分:1)

行为肯定是意外的,您不应该在函数调用中多次更改变量的值。序列点规则。试着看看link。另请阅读sequence points in a program

在功能调用中尝试不要多次更改一个变量的值