printf中的参数评估序列

时间:2013-06-04 15:56:11

标签: c printf

最近我遇到了理解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中是如何工作的。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
    }