【问题标题】:Parameter evaluation sequence in printf [duplicate]printf中的参数评估序列
【发布时间】:2023-03-25 02:56:01
【问题描述】:

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

这就是我的工作

#include<stdio.h>

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

当我在 gcc (linux) 上运行此代码 sn-p 时,我得到的输出为 7 6 8。 但是在 turbo (windows) 上运行它时,我得到了7 6 6 的输出。

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

谁能解释一下它是如何使用 gcc 在 linux 中工作的。

【问题讨论】:

  • 我怀疑您面临未定义的行为
  • 顺序依赖于实现,你不应该依赖它。
  • 另见this
  • 这是未定义的行为 (UB),因为您不止一次地修改了 a 的值,而没有中间的序列点。此外,函数参数的评估顺序是未指定的,因此即使不是 UB,您也不会得到有意义的结果。

标签: c printf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    由于标准中没有定义,因此称为未定义行为。

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

    例子:

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2011-12-17
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多