在 Windows 上使用 GCC 的 MinGW 误报数值

MinGW with GCC on Windows misreporting numeric values

出于某种原因,每当我在我的编译器设置中使用数值时(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;
}

比照。 screenshot of output.

valuevalue2 必须作为参数传递,即 在括号 内。将其更改为以下内容:

printf("The number is %d \n", value);

value2 做类似的事情。

再一次,这表明打开 -Wall-pedantic 开关进行编译很有用。 GCC 很可能会发出警告消息。

通过说

printf("The number is %d \n"), value;

您以某种方式(误)使用了 "comma operator" ,因此不会产生语法错误。您的打印语句 被视为

printf("The number is %d \n");

value si 作为空表达式执行。

现在,printf() 成为 variadic function, it does not check for the required number of arguments for supplied format specifiers (by default), but, point to note, as per the required format for printf(), you're essentially missing out the operand to the %d format specifier. This in turn invokes undefined behaviour

作为标准要求

If there are insufficient arguments for the format, the behavior is undefined.

正确的语法是

 printf("The number is %d \n", value);

其中 value 将是 %d 格式说明符的参数。

故事的寓意:启用编译器警告并注意它们。


注:一些建议,

  1. main()的推荐签名是int main(int argc, char**argv),或者,atleast int main(void).
  2. 试着养成同时定义和初始化任何变量的习惯。将使您免于在后面部分使用未初始化值(局部变量)的危险。