1

最近我遇到了一个理解printf()函数行为的问题。

这就是我正在使用的

#include<stdio.h>

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

当我在 gcc (linux) 上运行此代码片段时,我得到的输出为7 6 8. 但是在 turbo (windows) 上运行它时,我得到的输出为7 6 6.

我的理解是在 turbo 中,参数以从右到左的顺序传递。

任何人都可以解释它是如何使用 gcc 在 linux 中工作的。

4

2 回答 2

1

在这种情况下,不同的编译器可能会给出不同的结果。这个问题不仅与参数评估序列有关,printf而且还与参数评估序列有关。

什么是实现定义的行为?:

语言标准定义了semantics语言的类型constructs。当标准不包括在某些情况下要做什么的规范时。编译器设计者可能会选择他们认为正确的路径。因此,这些构造成为实现定义的。

因为,这在标准中没有定义,所以它被称为未定义的行为。

不幸的是,许多教师在考试中盲目给出这些问题,只是在编译器中测试以设置问题。

例子:

What is the output of following statement? But options don't include 
undefined behaviour

  #include<stdio.h>

    int main(){
    int a=5;
    printf("%d %d %d",a++,a++,++a);
    return 0;
    }
于 2013-06-04T16:01:04.493 回答
1

您的代码包含对同一变量的多次修改,修改之间没有任何序列点。因此,代码是不正确的,结果是不可预测的。

此外,函数参数的评估顺序是实现定义的。

于 2013-06-04T15:59:56.740 回答