【问题标题】:Implicit conversion while using += operator?使用 += 运算符时的隐式转换?
【发布时间】:2010-06-17 11:25:33
【问题描述】:

考虑以下代码:

int main()
{
    signed char a = 10;

    a  += a; // Line 5

    a = a + a;

    return 0;
}

我在第 5 行收到此警告:

d:\codes\operator cast\operator cast\test.cpp(5) : 警告 C4244: '+=' : 从 'int' 转换为 'signed char',可能会丢失数据

这是否意味着 += 运算符将右手运算符隐式转换为 int

P.S:我使用的是 Visual Studio 2005

编辑:仅当警告级别设置为 4 时才会出现此问题

【问题讨论】:

  • 嗯,我用 VS 2010 express 对其进行了测试,编译时没有任何警告,所以我认为它是一些“未定义的行为”?
  • 在c/c++常规选项下的项目设置中设置警告级别为4。
  • 在 VC++ 2010 Express 中使用 Level 4 仍然可以

标签: c++ operators


【解决方案1】:

你看到的是整体提升的结果

整数提升适用于大多数涉及整数类型的二进制表达式的两个参数。这意味着任何比 int 窄的整数类型都会在执行操作之前提升为 int(或者可能是 unsigned int)。

这意味着a += a 是作为int 计算执行的,但由于结果存储回a 中,即char,因此结果必须进行缩小转换,因此会出现警告。

【讨论】:

  • 只有在需要时才应该进行整体促销。在这种情况下,显然不是。标准说“char、signed char、unsigned char、short int 或 unsigned short int 类型的右值可以转换为 int [...] 类型的右值”它从来没有说它应该或将,只是它可以(即如果需要)
  • @PierreBdR: 5.17 说A += B 等同于A = A + B; 5.7(加法运算符)表示执行通常的算术转换; 5/9 说这意味着双方都进行积分提升,所以是的,在这种情况下需要积分提升。
【解决方案2】:

真的,这条线不应该有任何警告。运算符 += 对所有基本类型都有很好的定义。我会将其视为 VC++ 2005 的一个小错误。

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2010-10-27
    • 2019-01-08
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多