【问题标题】:C4244 level 4 warning on compound addition assignment, but not on sum and assignmentC4244 关于复合加法赋值的 4 级警告,但不是关于求和和赋值的警告
【发布时间】:2013-09-06 16:22:52
【问题描述】:

在 MSVS 2005 中,以下 C 代码会生成一个警告:

int main() {
    short a = 0;
    a += a; // C4244 (level 4)
    a = a + a; // OK
}

警告信息是:

warning C4244: '+=' : conversion from 'int' to 'short', possible loss of data

C++ 代码也是如此。

这两种说法有什么区别?我听说过,但找不到对任何 C 或 C++ 标准的任何引用,复合运算符隐式地将右侧表达式转换为左侧的类型。但是 sum-and-assignment 语句不应该做同样的事情吗?我也怀疑它与 int 提升有关,但从反汇编中可以看出,这两种情况都会发生:

[...]
    a += a; // C4244 (level 4)
00411394  movsx       eax,word ptr [a] 
00411398  movsx       ecx,word ptr [a] 
0041139C  add         ecx,eax 
0041139E  mov         word ptr [a],cx 
    a = a + a; // OK
004113A2  movsx       eax,word ptr [a] 
004113A6  movsx       ecx,word ptr [a] 
004113AA  add         eax,ecx 
004113AC  mov         word ptr [a],ax 
[...]

此外,警告级别设置为 4 的 MSVS 2008 中不会出现警告。所以我可以认为这是 VS 2005 中的错误,后来修复了,还是原始警告有什么意义?文档在这里对我没有帮助。

【问题讨论】:

  • 警告文本是什么?有趣的是,我怀疑我们大多数人都不知道 MS 代码。
  • 抱歉,刚刚编辑添加消息。

标签: c++ c compiler-warnings compound-operator


【解决方案1】:

这看起来像是一个虚假的警告。

警告应该警告您有关您编写的代码,而不是有关中间操作的警告。

您编写的代码不适用于任何int - 只有中间操作可以。

Jonathan Caves - MSFT 回答了 Visual Studio 语言论坛中有关 a case almost identical to yours 的问题。他的回答结束了:

“这已经在我们的错误列表中修复了很长一段时间 - 不幸的是,我们总是找到更多“重要”的错误来修复,所以我们从来没有 解决这个问题 - 但总有一天我们会的。”

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多