【问题标题】:Can't understand output of following C language program [duplicate]无法理解以下 C 语言程序的输出 [重复]
【发布时间】:2013-08-27 07:08:33
【问题描述】:

我无法理解以下 C 程序的输出,有什么想法吗?

#include<stdio.h>

#include<conio.h>

void main()

{
  int a=5,b=6,c=11;

  clrscr();

  printf("%d %d %d");

  getch();
}

这个程序的输出是:

11 6 5

我不明白为什么上面的程序在 printf 中给了我们反向变量值我从未声明必须打印哪个值...所以有没有理论认为如果我们没有声明必须打印哪个变量然后我们得到反向值我们上面在数据类型中声明的变量...

【问题讨论】:

  • 对我来说看起来像是未定义的行为,换句话说,它打印的东西甚至是远程相关的纯属运气。
  • 这是未定义的行为,我确信某处有重复。
  • 用另一个编译器试试同样的结果,你会得到随机结果(例如clang或gcc)

标签: c


【解决方案1】:

这是undefined behavior,除非您关心实现的具体细节,否则您不应期待特定的输出(或对它的解释)。

可能打印的是(随机的;即“不可预测的”)垃圾值,包含在一些堆栈位置或应该保存参数的寄存器中。

顺便说一句,一些编译器(即 GCC 使用 gcc -Wall 调用时)会给你一些警告。尽量避免它们(通过更正源代码)。

【讨论】:

  • 当涉及到 C 时,是不是很多事情都属于未定义行为的范畴,还是有一个列表?
  • 我认为理解 C 的已定义行为(和语义)比尝试列举所有未定义行为的可能情况更重要。
【解决方案2】:

printf 使用堆栈来存储和稍后打印数据。在这种情况下,首先 a 进入然后 b 然后 c。当 printf 弹出元素时,首先 c 出现然后 b 然后 a

【讨论】:

    【解决方案3】:

    here 有一个很好的解释。 在运行时,程序只会打印堆栈上的内容,这恰好是您的变量。

    【讨论】:

      【解决方案4】:

      供您参考

      int printf( const char* 格式, ... );

      ... - 指定要打印的数据的参数。如果任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式要求,则行为为未定义。如果参数多于格式所需的参数,则评估并忽略无关的参数

      正如Joachim所说,你得到的答案只是运气。你无法预测确切的结果。

      【讨论】:

        【解决方案5】:

        上述程序的输出因编译器而异。因为它是未定义的行为。

        Turbo C 将为您提供您期望的输出。在做 printf 之前尝试做一些操作。你不会得到你期望的输出。因为 printf 会打印最近的 stack 条目。

        如果您使用gcc under linux 编译相同的程序,您将收到警告。

        【讨论】:

        • 使用gcc,至少在使用gcc -Wall 编译时,您会在编译 时间(而不是建议的运行时)收到警告
        • 更新的 gcc 编译器会在编译时发出警告。我正在使用 gcc 版本 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
        • 那么请说“如果你在Linux下使用gcc编译同一个程序”
        • @BasileStarynkevitch 感谢您纠正我。我没有通知就输入了。
        猜你喜欢
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        相关资源
        最近更新 更多