【问题标题】:assigning float into int variable causes no warning将浮点数分配给 int 变量不会导致警告
【发布时间】:2014-07-23 16:14:51
【问题描述】:

所以,给定以下代码:

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

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

这是我用的

cc -Wall test.c

【问题讨论】:

  • -Wconversion 如果支持,你不要提及哪个编译器。
  • @ShafikYaghmour gcc 在 MS Windows 上。我可以验证 -Wconversion 是否有效。

标签: c types warnings implicit-conversion


【解决方案1】:

既然您确认您的编译器是gcc,那么您可以使用-Wconversion 标志,它应该会提供类似于以下的警告:

warning: conversion to 'int' alters 'double' constant value [-Wfloat-conversion]
i = 12.1234;
    ^

将浮点值转换为 int 是完全有效的,它将丢弃小数部分,并且只要该值可以表示,否则您将有未定义的行为。 C99 草案标准在4.9 部分中对此进行了介绍浮点积分转换

浮点类型的纯右值可以转换为 整数类型。转换截断;也就是小数部分 被丢弃。如果截断的值不能,则行为未定义 以目标类型表示。

【讨论】:

    【解决方案2】:

    浮点值可以分配给整数变量,但是当编译器强制将浮点值分配为整数变量时会发生隐式转换整数。

    将浮点数分配给整数后,浮点值中小数点后的数字会丢失。

    编辑:铸造 -> 转换

    谢谢R..

    【讨论】:

    • 隐式转换,而不是隐式转换。强制转换的定义是执行显式转换的运算符。隐式转换是矛盾的。
    • 默认情况下不应该产生警告,即没有 Wconversion 吗?我看到 clang 默认会产生这个警告
    【解决方案3】:

    您可能认为-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

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2021-10-15
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多