将float赋值给int变量不会导致任何警告

时间:2014-07-23 16:14:52

标签: c types warnings implicit-conversion

所以,给出以下代码:

int main(void) {
  int i;
  i = 12.1234;
  i++;
  return 0;
}

我编译了代码并且我期望并希望编译器给我一个警告,但它没有。我的编译器配置错了吗?有没有办法让我的编译器发出警告?

这是我用的

  

cc -Wall test.c

3 个答案:

答案 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