Почему я могу использовать константы как операторы в C? - PullRequest
34 голосов
/ 24 августа 2011

Почему эта программа ниже не показывает какую-либо ошибку?

int main (void) {
    "ANGUS";
    1;
    3.14;
    return 0;
}

Ответы [ 7 ]

27 голосов
/ 24 августа 2011

Каждое из этих утверждений является выражением, которое оценивается как значение, которое затем отбрасывается.Сравните это с тем, вызвали ли вы функцию, которая возвратила int, char или float, без использования возвращаемого значения.Это также выражение, которое оценивается как значение.

Нередко есть функции, которые возвращают значения, которые могут вызывать или не интересовать вызывающую функцию, например, где printf("%d", 9001) возвращает количество напечатанных символов.,Вызывающая сторона может использовать возвращаемое число или просто проигнорировать его.

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

16 голосов
/ 24 августа 2011

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

x++;
printf ("Hello, world\n");

Первое - это на самом деле выражение, которое, как оказалось, имеет побочный эффект увеличения переменной после «возврата»it.

Последний вызов функции фактически возвращает значение (количество напечатанных символов), которое также отбрасывается.

С определенной точки зрения это ничем не отличается от операторов:

42;
3 * 12;

кроме того факта, что они не имеют побочных эффектов, которые делают их полезными.

На самом деле, даже x = 1 - это выражение, в котором результат отбрасывается.Именно это делает возможным x = y = z = 0, поскольку это эффективно:

(x = (y = (z = 1)));

Все это подробно описано в разделе C99, раздел 6.8.3 Expression and null statements, в котором частично говорится:

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

9 голосов
/ 24 августа 2011

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

5 голосов
/ 24 августа 2011

Так как в c это допустимое утверждение, но когда вы используете java, оно даст вам ошибку времени компиляции.

4 голосов
/ 24 августа 2011

С чего бы это?Первые три строки в вашем main ничего не делают и возвращают 0;является допустимым выражением.

Если вы используете gcc для компиляции программы, попробуйте включить все предупреждения (с параметром -Wall).Это напечатало бы warning: statement with no effect [-Wunused-value]

2 голосов
/ 24 августа 2011

Потому что это действительно. Строка или число является допустимым выражением, а выражение, за которым следует точка с запятой, является утверждением (также неофициально известным как инструкция).

0 голосов
/ 12 июня 2014

Он также действителен в C ++ и имеет хакерское использование в Visual Studio, где вы хотите «Найти все ссылки» для перечисления, вы можете ввести перечисление в отдельной строке, заканчивая точкой с запятой, и вы можете использовать контекстное меню для поиска ссылок.

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