关于复合添加分配的C4244 4级警告,但不包括总和和分配

时间:2013-09-03 12:20:23

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

在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 ++标准的引用,复合运算符隐式地将右手表达式转换为左侧的类型。但是,总和和赋值语句应该不一样吗?我还怀疑它与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中的错误,稍后修复,或者对原始警告有一定意义吗?该文档对我没有帮助。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

  

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