在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中的错误,稍后修复,或者对原始警告有一定意义吗?该文档对我没有帮助。
答案 0 :(得分:3)
这看起来像是一个虚假的警告。
警告应该警告您编写的代码,而不是中间操作。
您编写的代码不适用于任何int
- 只有中间操作可以。
Jonathan Caves - MSFT回答了有关Visual Studio语言论坛中a case almost identical to yours的查询。他的回答结束了:
“这已经在我们的错误列表上修复了一段时间 - 不幸的是,我们总能找到更多“重要”的错误来解决,所以我们永远不会 解决这个问题 - 但总有一天我们会。“