У меня есть следующий простой код на С++:
#include "stdafx.h"
int main()
{
int a = -10;
unsigned int b = 10;
// Trivial error is placed here on purpose to trigger a warning.
if( a < b ) {
printf( "Error in line above: this will not be printed\n" );
}
return 0;
}
Скомпилированный с использованием Visual Studio 2010 (по умолчанию консольное приложение С++) дает warning C4018: '<' : signed/unsigned mismatch" on line 7
как ожидалось (код имеет логическую ошибку).
Но если я изменю unsigned int b = 10;
на const unsigned int b = 10;
, предупреждение исчезнет! Существуют ли какие-либо известные причины такого поведения? gcc
показывает предупреждение независимо от const
.
Обновление
Я вижу из комментариев, что многие люди предлагают "он как-то оптимизировался так, чтобы не было необходимости". К сожалению, требуется , так как в моем примере кода есть фактическая логическая ошибка, помещенная так, чтобы вызвать предупреждение: оператор print
не будет называться, независимо от того, что -10
на самом деле меньше 10
. Эта ошибка хорошо известна, и "предупреждение с подписью/без знака" точно выражается, чтобы найти такие ошибки.
Обновление
Я также вижу из комментариев, что многие люди "нашли" подписанную/неподписанную логическую ошибку в моем коде и объясняют это. Там, где это не нужно, эта ошибка помещается исключительно для запуска предупреждения, тривиальна (-10
проверяется на (unsigned int)-10
, то есть 0xFFFFFFFF-10
), и вопрос не в этом:).