Подтвердить что ты не робот

Почему я могу использовать константы в качестве операторов в C?

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Первый - это выражение, которое просто имеет побочный эффект приращения переменной после "возврата".

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

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

42;
3 * 12;

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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