Почему этот код C ++ компилируется? - PullRequest
2 голосов
/ 13 января 2011

Может кто-нибудь объяснить мне, почему следующий код компилируется? Это игнорируется компилятором?

#include <stdio.h>
int main() {
    1234;
    return 0;
}

Ответы [ 7 ]

8 голосов
/ 13 января 2011

Стандарт обязывает исполнителей разрешать операторы даже без видимого эффекта. Это происходит главным образом потому, что благодаря магии макросов и шаблонов их удивительно легко придумать.

5 голосов
/ 13 января 2011

В этом коде нет ничего плохого.Это полностью законно.Это ничего не делает, но это абсолютно законно.Ваш компилятор - с правильными настройками предупреждений - может предупредить вас, что он совершенно бесполезен, но он полностью совместим.

3 голосов
/ 13 января 2011

В C (и, следовательно, C ++), выражение является оператором и оценивается на предмет его побочных эффектов, даже если результат отбрасывается.Если у него нет побочных эффектов, компилятор может выяснить и оптимизировать его (очень вероятно в вашем случае), но он все равно должен скомпилировать код.

Конечно, любой компилятор предупредит об этом, если это предупреждение явно не отключено.

3 голосов
/ 13 января 2011

Вы можете считать оператор 1234; похожим на оператор getc(); в том смысле, что оба оператора «возвращают» (оценивают) значение, но с возвращаемым значением ничего не делается. Вызов getc () имеет побочный эффект от потребления символа из стандартного ввода, так что вы скорее увидите это в программе, чем просто число. Но оба законны.

У DeadMG есть хорошая пометка о том, почему это хорошая идея, разрешить это. Это не потому, что 1234 может быть определен как макрос (потому что, насколько я знаю, это не разрешено). Это потому, что, особенно с более сложными макросами, легко получить макрос, который может привести к некоторому утверждению, которое ничего не делает.

3 голосов
/ 13 января 2011

Хороший компилятор предупредит вас о том, что у вас есть оператор, который не имеет побочного эффекта a (фактически, пустой оператор), однако в C / C ++ допустимы нулевые операторы, поэтому ошибки компиляции не будет.

1 голос
/ 13 января 2011

Включить предупреждения.
Установить предупреждения, которые будут обрабатываться как ошибки (как обычно).

Теперь это будет вести себя так, как вы ожидаете:

> cat t.cpp
int main() {
    1234;
    return 0;
}
> g++ t.cpp -Wall -Wextra -pedantic -Werror
cc1plus: warnings being treated as errors
t.cpp: In function ‘int main()’:
t.cpp:2: warning: statement has no effect

Это просточто настройки компилятора по умолчанию: lax

0 голосов
/ 13 января 2011

Поскольку 1234 - это константа, она позволяет вам сойти с рук.Замена его на «x» (без объявления переменной x) или «This not compile» должна привести к его сбою.

По сути, это пустое утверждение, так что никакого вреда нет.продолжает идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...