-1

如果这个问题已在其他地方得到回答,我深表歉意,但我已经搜索过,但尚未找到答案......

编译以下代码时收到以下警告:

warning: conversion to 'short unsigned int' from 'int' may alter its value

这是代码的摘录(几个例子来说明我的问题):

std::vector<unsigned short int> list = {1}; 
unsigned short int one = 1;

one += list.at(0);                            // produces warning
one += 1;                                     // produces warning
one += static_cast<unsigned short int> 1;     // produces warning
one++;                                        // does not produce warning

除了加法之外,我还尝试了其他形式的算术。为什么编译器会抛出此警告,声称我正在从“int”转换为“unsigned short int”(尤其是当我明确将其转换为无符号时)?看起来,对于第二种情况,'one += 1;',因为表达式的右侧是一个正数,编译器将它添加到无符号变量 'one' 中不会有任何问题。

此外,最后的测试,'one++;' 不会产生警告,我不知道为什么。

我仍然习惯在这里提问,所以如果这个问题是微不足道的或不清楚的,请原谅我。谢谢!

4

1 回答 1

1

C++11 §5.17/7:

”形式为op
的表达式的行为等价于op,除了只计算一次E1 = E2E1 = E1 E2E1

这意味着例如

one += list.at(0);

被评估为好像它是

one = one + list.at(0);

除了one只评估一次。

在表达式one + list.at(0)中,两个操作数首先int通过 C++11 §5/9提升为通常的算术转换规则。

简而言之,C++ 二元算术运算符不处理范围可能小于int. 操作数被提升。然后对于最终分配,有(逻辑)转换。

于 2014-07-11T04:51:23.440 回答