繁体   English   中英

将 float 分配给 int 变量不会导致警告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM