出于某种原因,每当我在编译器设置中使用数值(在Windows上使用MinGW,使用CMD提示进行编译和运行)时,它就完全误报了程序中的数字。
代码示例:
//C hello world example
#include <stdio.h>
int main()
{
int value;
value = 10;
printf("The number is %d \n"), value;
int value2;
value2 = -100;
printf("The number is %d \n"), value2;
return 0;
}
答案 0 :(得分:6)
value
和value2
必须作为参数传递,即
printf("The number is %d \n", value);
与value2
类似。
再一次,这表明使用-Wall
和-pedantic
开启进行编译很有用。海湾合作委员会很可能会发出警告信息。
答案 1 :(得分:3)
说
printf("The number is %d \n"), value;
您以某种方式(错误地)使用"comma operator",因此不会产生语法错误。您的打印声明被视为为
printf("The number is %d \n");
和value
si作为void表达式执行。
现在,printf()
是variadic function,它不会检查所提供的格式说明符所需的参数数量(默认情况下),但是,请注意,根据{的所需格式{1}},您基本上错过了printf()
格式说明符的操作数。这反过来调用undefined behaviour。
作为标准要求
如果格式的参数不足,则行为为 未定义。
正确的语法是
%d
其中 printf("The number is %d \n", value);
将是value
格式说明符的参数。
故事的道德:启用编译器警告并注意它们。
注意:一些建议,
%d
的推荐签名为main()
,或至少 int main(int argc, char**argv)
。