【问题标题】:please explain the output the following c program [duplicate]请解释以下c程序的输出[重复]
【发布时间】:2014-06-29 06:16:27
【问题描述】:

谁能解释以下C程序的结果?

#include<stdio.h>

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

4 3 4的输出怎么样?

【问题讨论】:

  • 我不能就发出的具体值给你一个正确的答案,但我知道这是未定义的行为。 C 标准没有规定将参数评估为函数的顺序。
  • 除了@KarlNicoll 所说的,编译器之间的输出可能不同。例如,我尝试使用 clang,它却给了 2 2 4
  • 关于荒谬代码的荒谬问题有几千个重复。没有头脑正常的人会写出这样的垃圾,也没有人真正关心结果。
  • 请阅读本指南关于序列点stackoverflow.com/questions/4176328/…

标签: c post-increment pre-increment


【解决方案1】:

C++ 标准未定义参数的求值顺序;而且,“如果一个标量对象的副作用相对于同一标量对象的另一个副作用是未排序的,则行为是未定义的”。

因此,对于同一个函数调用的参数,相同标量值的后自增和预自增是未定义的。显然,在您的情况下,这两个增量都是在评估第一个和最后一个参数之前完成的。

【讨论】:

  • 第一句话应该是未指定的。
【解决方案2】:

您从i = 2 开始。因为i++++i,变量i加2(每个++加1)。因此,当你完成时,它的值为 4。

语法i++ 表示在递增之前使用i 的值。这就是为什么中间数(printfi++ 得到)不能是 4。

它是 4 3 4 而不是其他诸如 2 2 4 或 2 3 3 或 4 3 3 之类的原因与评估 ++ 运算符时与 printf 函数的参数时相比被设置。根本不应该编写这样的代码,至少对于任何人都必须使用的软件来说是这样。

【讨论】:

    【解决方案3】:

    您已进入未定义行为的领域。 C 不保证传递给函数的参数的评估顺序,尤其是可变参数函数。像这样的陈述,这是一个经典的面试问题,其结果是“未知的”——它可以在编译器版本、平台等之间发生变化,并且类似于问题:

    int i = 1;
    int a[3] = { 1, 2, 3 };
    int j = a[i++] - a[++i];
    

    什么是j?答:这取决于您的编译器、版本、平台等:您不能用来推断它的一件事是 C 规范。

    但是您想知道 3,不是吗?那是因为您的编译器首先评估了 ++i,它将 i 递增到 3。然后您的编译器评估了 i++,后递增,其实现等效于此(在 C++ 中,抱歉):

    int operator ++ (int) { // post-increment indicated by int parameter
        int i = *this;
        this->operator++();
        return i;
    }
    

    或其他伪代码

    int tempI = i;
    ++i;
    

    所以你实际写的是:

    printf("%d %d %d\n", i, (j = i, ++i), ++i);
    

    在评估传递给 printf 的参数结束时,i 的值是 4,但 i++ 返回的临时值保持其值 3。

    因此:4(i) 3(temp) 4(i)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      相关资源
      最近更新 更多