gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:57 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com