Почему эта программа ниже не показывает никаких ошибок?
int main (void) {
"ANGUS";
1;
3.14;
return 0;
}
Почему эта программа ниже не показывает никаких ошибок?
int main (void) {
"ANGUS";
1;
3.14;
return 0;
}
Каждое из этих выражений представляет собой выражения, которые вычисляют значение, которое затем отбрасывается. Сравните это с тем, если вы вызвали функцию, которая вернула int, a char или float, не используя возвращаемое значение. Это также выражение, которое оценивает значение.
Нередко есть функции, возвращающие значения, которые вызывающий может или не может заинтересовать, например, где printf("%d", 9001)
возвращает количество напечатанных символов. Вызывающий может использовать возвращаемый номер или просто игнорировать его.
Если компилятор жаловался всякий раз, когда вы игнорировали возвращаемое значение, у вас был бы очень шумный журнал построения. Некоторые компиляторы, однако, диагностируют (если включены достаточные флаги предупреждения), такие бессмысленные побочные эффекты литералов и переменных.
Это совершенно справедливо для оператора в 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 для его стороны эффекты, такие как назначения и вызовы функций, которые имеют побочные эффекты.
Совершенно верно, что оператор состоит только из выражения. Ничего не достигается, делая это в ваших примерах, но это абсолютно все равно.
Так как в c это действительный оператор, но когда вы используете java, он даст вам ошибку времени компиляции.
Почему? Первые три строки в вашем главном ничего не делают и возвращают 0; является допустимым выражением.
Если вы используете gcc для компиляции программы, попробуйте включить все предупреждения (с параметром -Wall). Это напечатает warning: statement with no effect [-Wunused-value]
Потому что это действительно так. Строка или число является допустимым выражением, а выражение, за которым следует точка с запятой, является инструкцией (также неофициально известной как инструкция).
Он также действителен в С++ и имеет хакерское использование в Visual Studio, где вы хотите "Найти все ссылки" для перечисления, вы можете ввести перечисление на строку, которая сама по себе заканчивается точкой с запятой, и вы можете использовать контекстное меню, чтобы найти ссылки.