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