所以,给出以下代码:
int main(void) {
int i;
i = 12.1234;
i++;
return 0;
}
我编译了代码并且我期望并希望编译器给我一个警告,但它没有。我的编译器配置错了吗?有没有办法让我的编译器发出警告?
这是我用的
cc -Wall test.c
答案 0 :(得分:5)
浮点值可以指定到整数变量,但编译器强制将浮点值指定为一个隐式转换整数。
将浮点值赋给整数后浮点值中的十进制表示法后的数字会丢失。
编辑:施法 - >转换
谢谢R ..
答案 1 :(得分:5)
由于您确认编译器为gcc
,因此您可以使用-Wconversion标志,该标志应提供与此类似的警告:
warning: conversion to 'int' alters 'double' constant value [-Wfloat-conversion]
i = 12.1234;
^
将浮点值转换为 int 是完全有效的,它将丢弃小数部分,只要该值可以表示,否则您将有未定义的行为。 C99草案标准涵盖了4.9
浮动积分转换部分中的内容:
浮点类型的prvalue可以转换为a的prvalue 整数类型。转换截断;也就是说,小数部分 被丢弃了。如果截断值不能,则行为未定义 用目的地类型表示。
答案 2 :(得分:0)
您可能希望-Wall
确实启用 ALL 警告,但不会!
在错误的环境中,有很多警告甚至都没有道理。
它是以下标志的集合:
-Waddress -Warray-bounds (only with -O2) -Wc++11-compat -Wchar-subscripts -Wenum-compare (in C/ObjC; this is on by default in C++) -Wimplicit-int (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) -Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) -Wmaybe-uninitialized -Wmissing-braces (only for C/ObjC) -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvolatile-register-var
如此处所述:https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Warning-Options.html
您需要的是如上所述的-Wconversion
。另一个非常有用的标志可能是-Wextra
。