В 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
[...]
Кроме того, предупреждение не появляется в MSVS 2008 с уровнем предупреждения, установленным на 4. Так могу ли я считать это ошибкой в VS 2005, которая была исправлена позже, или есть какой-то смысл в первоначальном предупреждении? Документация мне здесь не помогает.
Это похоже на поддельное предупреждение.
Предупреждения должны предупреждать вас о написанном вами коде, а не о промежуточных операциях.
Код, который вы написали, не работает ни с одним int
— только промежуточные операции.
Запрос о случай почти идентичный вашему на форумах Visual Studio Languages отвечает Джонатан Кейвс — MSFT. Его ответ заканчивается:
«Это было в нашем списке ошибок, чтобы исправить в течение долгого времени —
к сожалению, мы всегда находим больше «важных» ошибок, чтобы исправить
найти способ исправить это — но когда-нибудь мы будем. «
Других решений пока нет …