我希望您帮助理解以下内容:
代码:
int main() {
int i=23;
float f=7.5;
printf("%f", i);
return 1;
}
输出为0.000000
,为什么不是7.500000
?
代码
int main() {
int i=23;
float f=7.5;
printf("%d\n",f);
printf("%f",i);
return 1;
}
输出为1455115000, 7.500000
。为什么不编译错误?这个号码是1455115000是什么?为什么现在正在印刷7.500000?
答案 0 :(得分:8)
printf
调用中格式/参数不匹配会导致未定义的行为。如果您调高警告级别,编译器可能会告诉您。例如,clang
会为您的第一个程序发出此警告:
example.c:5:10: warning: conversion specifies type 'double' but the argument has
type 'int' [-Wformat]
printf("%f", i);
~^ ~
%d
这些是你的第二个:
example.c:5:10: warning: conversion specifies type 'int' but the argument has
type 'double' [-Wformat]
printf("%d\n",f);
~^ ~
%f
example.c:6:10: warning: conversion specifies type 'double' but the argument has
type 'int' [-Wformat]
printf("%f",i);
~^ ~
%d
这根本没有特别的标志。 gcc
默认警告您的程序。例1:
example.c:5: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
示例2:
example.c:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
example.c:6: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
这两个编译器也警告你隐含声明printf
,但是我将这些消息留下了,因为它们与你的问题并不严格相关。
答案 1 :(得分:1)
输出是0.000000,怎么不是7.500000?
因为%f
告诉printf
期待float
,但i
不是float
。所以你要调用未定义的行为。
为什么不编译错误?
在GCC(可能还有其他编译器)中,你会收到一条警告信息。
答案 2 :(得分:1)
在第一种情况下,您尝试打印i
的值,以获取。{
值7.5
您需要打印f
。
在第二种情况下,问题是格式为不匹配
说明符和提供给printf()
更多关于2。
要打印float
值,需要将其与%f
格式说明符配对。对于int
eger值,这应为%d
。这些是向后的,这就是为什么由于这种不匹配而看到未定义的行为/输出的原因。
如果编译具有最高警告级别的程序,则可能会收到有关这些类型的不匹配/错误的警告。
的除了强> :
通常,返回值0
表示程序终止成功。 非零值(如1
)表示存在问题。可能与您的计划无关,但您可能需要记住这些内容。