[英]Getting warning:type of variable defaults to int in function of type float *
[英]assigning float into int variable causes no warning
因此,给出以下代码:
int main(void) {
int i;
i = 12.1234;
i++;
return 0;
}
我编译了代码,我期望并希望编译器给我一个警告,但它没有。 我的编译器配置错误吗? 有没有办法让我的编译器发出警告?
这是我用的
cc -Wall test.c
既然你确认你的编译器是gcc
那么你可以使用-Wconversion标志,它应该提供类似于这样的警告:
warning: conversion to 'int' alters 'double' constant value [-Wfloat-conversion]
i = 12.1234;
^
将浮点值转换为int是完全有效的,它会丢弃小数部分,只要该值可以表示,否则您有未定义的行为。 C99 草案标准在第4.9
节浮点积分转换中涵盖了这一点:
浮点类型的纯右值可以转换为整数类型的纯右值。 转换截断; 也就是说,小数部分被丢弃。 如果截断的值无法在目标类型中表示,则行为未定义。
可以将浮点值分配给整数变量,但当编译器强制将浮点值分配为整数时,会发生隐式转换。
将浮点数分配给整数后,浮点值中十进制表示法后面的数字会丢失。
编辑:铸造 -> 转换
谢谢R..
您可能期望-Wall
确实启用所有警告,但事实并非如此! 有很多警告在错误的环境中甚至没有意义。
它是以下标志的聚合:
-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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.