【问题标题】:Why is the output of the program so? [duplicate]为什么程序的输出是这样的? [复制]
【发布时间】:2013-07-28 12:01:10
【问题描述】:
# include <stdio.h>

int main()
{
 int a=4;
 printf("%f",a);
}

输出

0.000000 

还有

# include <stdio.h>

int main()
{
 float a=4.5;
 printf("%d",a);
}

输出

0

谁能解释上述输出的行为? 我知道使用不同的覆盖规范是愚蠢的,但我只是为了理论上的目的。

【问题讨论】:

  • Unexpected output of printf() - if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), the behavior is undefined

标签: c


【解决方案1】:

谁能解释上述输出的行为?

这是未定义的行为。

(C11, 7.1.4p1) “如果函数的参数具有 [...] 或具有可变数量参数的函数不期望的类型(提升后),则行为未定义”

为了历史,有一个 C 缺陷报告 (DR#83) 解决了这个完全相同的问题:

http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html

【讨论】:

  • 您可能想澄清该缺陷报告是关于标准本身而不是语言的。标准并没有说(当时)它是未定义的。
【解决方案2】:

printf 不是类型安全的。参数是预期类型是您的责任,否则会发生未定义的行为。

事情更有趣,因为参数的类型是默认提升的:short/char -> int, float -> double

你的例子是未定义的行为,所以你可以得到任何东西,但可能发生在幕后的是构成实际参数的字节被解释为它们在字符串格式中指定的类型。请注意,float 被提升为 double%f 还指定了 double,这可能是 8 个字节,而 int 可能是 4 个字节......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多