【问题标题】:Conversions implied by assignment expressions赋值表达式隐含的转换
【发布时间】:2021-11-08 11:54:22
【问题描述】:

标准的 6.5.16 章节有 2 段:

在简单赋值(=)中,右操作数的值为 转换为赋值表达式的类型并替换 值存储在左操作数指定的对象中。

左操作数具有原子的、合格的或不合格的算术 类型,右边是算术类型;

所以考虑下面的代码:

float f = 1.2f;
int i = f; //error

if 都具有算术类型,因此应将 f 转换为 i。但是编译代码会产生错误:

error: conversion from ‘float’ to ‘int’ may change value [-Werror=float-conversion]
    6 |     int i = f;

但是当添加显式转换时,它编译得很好:

float f = 1.2f;
int i = (int) f;  //ok

那么在赋值表达式中允许什么样的转换呢?我虽然标准中的转换相当于强制转换(type)

更新:

GCC 9.3.0

这是我的旗帜:

-Werror
-Wextra
-pedantic
-Wconversion
-g3
-O3
-Wno-unused-result
-Wno-unused-parameter
-Wstrict-prototypes

【问题讨论】:

  • 您的代码应该可以编译。这不是因为您已将编译器配置为将此警告视为错误。
  • -Werror 表示“将每个警告都视为错误”。
  • -Werror 将警告转换为错误。您的编译器可以很好地生成关于可能的值更改的警告,您要求它使其成为错误,而事实上,这是完全合法的。
  • 严格遵守gnu17? gnu17 不符合标准...您可能需要添加-std=c11(或c99c17 ...)gcc.gnu.org/onlinedocs/gcc/…
  • 您可能希望删除 -Werror 并将其替换为 -pedantic-errors(并添加 -std=c??,如 pmg 所说)。然后你仍然会收到一致性问题的错误,但所有其他警告都不会变成错误。

标签: c language-lawyer assignment-operator


【解决方案1】:

来自 gcc - wiki(自 v4.3 起)

-W转换

对可能改变值的隐式转换发出警告。这包括 实数和整数

之间的转换
  14 float  vfloat;
  15 double vdouble;
  16 
  17 void h (void)
  18 {
  19   unsigned int ui = 3;
  20   int   si = 3;
  21   unsigned char uc = 3;
  22   signed char sc = 3;
  23   float  f = 3;
  24   double d = 3;
  25 
  26   fsi (3.1f); /* { dg-warning "conversion" } */
  27   si = 3.1f; /* { dg-warning "conversion" } */
  28   fsi (3.1);  /* { dg-warning "conversion" } */
  29   si = 3.1;  /* { dg-warning "conversion" } */
  30   fsi (d);    /* { dg-warning "conversion" } */
  31   si = d;    /* { dg-warning "conversion" } */
  32   fui (-1.0); /* { dg-warning "overflow" } */
  33   ui = -1.0;   /* { dg-warning "overflow" } */
  34   ffloat (INT_MAX);  /* { dg-warning "conversion" } */
  35   vfloat = INT_MAX;  /* { dg-warning "conversion" } */
  36   ffloat (16777217); /* { dg-warning "conversion" } */
  37   vfloat = 16777217; /* { dg-warning "conversion" } */
  38   ffloat (si); /* { dg-warning "conversion" } */
  39   vfloat = si; /* { dg-warning "conversion" } */
  40   ffloat (ui); /* { dg-warning "conversion" } */
  41   vfloat = ui; /* { dg-warning "conversion" } */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多