if (a < b)
равно псевдоif (unsigned int < unsigned char)
.
Всякий раз, когда в выражении используется тип char, правила продвижения целых чисел в C неявно преобразуют его в int
. После того, как это будет сделано, у вас есть
if (unsigned int < int)
.
Всякий раз, когда в выражении используются два целых числа одного ранга, но с разным знаком, знаковое число неявно преобразуется в беззнаковое. Это определяется обычными арифметическими преобразованиями, также известными как балансировка.
Итак, ваше первое выражение преобразуется в
if (unsigned int < unsigned int)
прежде чем что-либо будет сделано.
Во втором выражении у нас есть if (a < (b ? b : c))
, что равно псевдо
if (unsigned int < (unsigned char ? unsigned char : unsigned char))
.
Целочисленные преобразования выполняются для всех символов, поэтому они неявно преобразуются в
if (unsigned int < (int ? int : int))
.
Затем странное, неясное правило для условного оператора диктует, что 2-й и 3-й операторы оператора ?: должны быть сбалансированы с обычными арифметическими преобразованиями. В этом случае они уже однотипные, так что ничего не происходит. Мы заканчиваем с
if (unsigned int < int)
Балансировка происходит снова, результат будет оцениваться как
if (unsigned int < unsigned int)
Когда я скомпилирую его с помощью Microsoft
Когда вы компилируете с Microsoft, все ставки сняты, их компилятор очень плохо следует стандарту. Ожидайте странных, нелогичных предупреждений.
person
Lundin
schedule
11.10.2012
-W3
. Если я не укажу уровень предупреждения, то предупреждения вообще не будет. - person Mikhail Edoshin   schedule 11.10.2012