【发布时间】: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