Что такое 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 - оно возвращает значение, присвоенное левой стороне; ;
превращает это в утверждение.