Могут ли скобки в C вызвать неявное приведение? - PullRequest
7 голосов
/ 17 сентября 2011

Фон

В прошлый раз, когда я спрашивал о том, что круглые скобки вызывали неявное приведение ( здесь ), @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 достаточно мало, чтобы не вызывать переполнение на моей машине ...)

Ответы [ 2 ]

8 голосов
/ 17 сентября 2011

Во-первых, давайте проясним некоторые термины.Ничто не может вызвать «неявное приведение», потому что такого нет. cast - это явный оператор, состоящий из имени типа в скобках, предшествующих выражению, например (double)42;он определяет преобразование .Преобразования могут быть либо явными (указанными оператором приведения), либо неявными, как в double x = 42;.Так что вы действительно спрашиваете, могут ли скобки вызывать неявное преобразование .

И ответ, по крайней мере в коде, который вы нам показали, - нет.

Цитирование C99 стандарта (3,7 МБ PDF), раздел 6.5.1p5:

Выражение в скобках является основным выражением.Его тип и значение идентичны типам выражения без скобок.Это lvalue, обозначение функции или выражение void, если выражение без скобок является, соответственно, lvalue, указателем функции или выражением void.

И поскольку 256U уже являетсяprimary expression, скобки вообще не имеют значения;Скобки обычно указывают приоритет, но в этом случае нет прецедента, чтобы указать.

Какой инструмент статического анализа вы используете?Возможно, вам следует отправить отчет об ошибке.

4 голосов
/ 17 сентября 2011

Инструмент как-то запутался. Здесь нет кастинга. Эти скобки просто указывают на приоритет.

...