Фон
В прошлый раз, когда я спрашивал о том, что круглые скобки вызывали неявное приведение ( здесь ), @pmg был достаточно хорош, чтобы указать, что «Ничего в C не делается ниже int». Но там, обсуждение было побитовые операторы, а скобки оказались просто отвлечением.
Введение
Ниже скобки являются главной достопримечательностью. Или, чтобы быть более скучным, но точным, единственные операторы, которые я вижу, - это круглые скобки и операторы присваивания.
В этой ссылке об операторе скобок C я ничего не вижу в скобках, изменяющих тип (за исключением синтаксиса typecast, что не соответствует данному случаю).
Между тем, вот ссылка, которая напоминает, что - это автоматическое преобразование типов при присваивании , но я не думаю, что это объяснит поведение инструмента статического анализа, который я опишу здесь.
Как и в моем предыдущем вопросе, «ОК» означает, что инструмент статического анализа не предупредил о неявном преобразовании типа , а «НЕ ОК» означает, что он это сделал.
int main(void)
{
unsigned int ui;
int i;
ui = (256U); // NOT OK (*) (1)
i = (256U); // NOT OK (*) (2)
i = 256; // OK
i = 256U; // NOT OK
ui = 256U; // OK (3)
ui = 256; // NOT OK
return(0);
}
Я могу понять их всех, кроме первых двух - что делают скобки? Если они ничего не делают в плане неявного приведения типов, то я ожидаю, что (1) будет в порядке, а (2) - НЕ в порядке. Если они выполняют автоматическое продвижение типов для типов, меньших, чем int, до int, то я ожидаю, что (1) будет НЕ в порядке, а (2) будет в порядке. Но этот инструмент говорит, что оба не в порядке.
Это ошибка статического инструмента анализа или инструмент верный, и мне нужно еще кое-что узнать о неявных преобразованиях типов в C?
(Кстати, я надеюсь, что значение 256 достаточно мало, чтобы не вызывать переполнение на моей машине ...)