c++ - C4244 4 级关于复合加法赋值的警告,但不涉及求和和赋值

标签 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 中的一个错误(后来已修复),还是原始警告有一定意义?该文档在这里对我没有帮助。

最佳答案

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

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

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

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

"This is has been on our list of bugs to fix for quite a while - unfortunately we always find more "important" bugs to fix so we never get around to fixing this one - but someday we will."

关于c++ - C4244 4 级关于复合加法赋值的警告,但不涉及求和和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592189/

相关文章:

c++ - 在前往 C++ 之前,我应该首先学习什么?

c - 如何在函数中返回多个变量

c# - 为什么 Interlocked.Exchange 触发警告 CS4014?

c++ - 有什么方法可以加速 gcc 中的宏预处理?

c++ - 关于 MFC 库中的 _variant_t 类型

c++ - 从起点遍历图形并在起点结束 C++

c - Win32 快捷菜单在任何情况下都不发送消息

c++ - 覆盖单个文件的编译标志

c++ - "Variable shadowed"lambda 中的警告(未捕获时)

c++ - 模板特化,在一个函数中具有多个模板参数