Что такое printf(), оператор или выражение? Почему это работает с троичным оператором?

Если троичный оператор запрашивает выражение, а не оператор, то почему он компилируется? printf();? Является printf(); выражение или утверждение?

2 ответа

Когда вы вызываете функцию (любую функцию), это выражение. Когда вы добавляете завершающий ; Вы превращаете это выражение в утверждение.

Фактически, вы можете превратить любое выражение в оператор, имея само выражение, и добавить терминатор оператора ;, Например, все присваивания являются выражениями, например,

a = b + c

это выражение, но

a = b + c;

это утверждение.

Следует также отметить, что обычно все выражения "возвращают" значение. В случае выражения присваивания он возвращает значение присваиваемой переменной (поэтому в приведенном выше примере выражение присваивания возвращает значение a * после того, как задание выполнено). Вот как вы можете связать выражения вместе. В приведенном выше примере оператор просто отбрасывает результат выражения присваивания.

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


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

Пример:

a < b ? printf("a < b\n") : printf("a >= b\n");

Вышеуказанная строка является заявлением. Оператор содержит одно выражение, троичное выражение, и это выражение содержит три подвыражения (условие и два вызова функции).

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

Добавление к ответу Иоахима:

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

Когда вы делаете

a = b + c;

это значит, чтобы оценить подвыражение b + c а затем назначить ему a которое также является выражением в C - оно возвращает значение, присвоенное левой стороне; ; превращает это в утверждение.

Другие вопросы по тегам