Что такое полное выражение в C?

Я изучаю C-язык из книги "C Primer Plus" Стивена Прата, и он пришел к выводу:

"Полное выражение - это выражение, которое не является подвыражением большего выражение. Примеры полных выражений включают выражение в выражение выражения и выражение, служащее тестовым условием для цикла while"

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

Может ли кто-нибудь объяснить, что подразумевается под "полным выражением" и как я могу указать, что выражение является полным выражением или нет?

Ответ 1

Он взял это прямо из стандарта C, например, C11 6.8:

Полное выражение - это выражение, которое не является частью другого выражения или декларатора. Каждое из следующего является полным выражением: инициализатор, который не является частью соединения буквальный; выражение в выражении выражения; контролирующее выражение выбора (if или switch); управляющее выражение оператора while или do; каждый (необязательных) выражений оператора for; (необязательное) выражение в обратном выражение. Существует точка последовательности между оценкой полного выражения и оценка следующего полного выражения для оценки.

Некоторые примеры:

if(x)

for(x; y; z)

return x;

где x y и z - полные выражения.

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

То, что может понадобиться программисту, - это последние предложения приведенного выше текста, а это означает, что после полного выражения все побочные эффекты этого выражения выполняются. Поэтому, если я пишу код, например if(i++) printf("%d", i);, то я знаю, что i++ был выполнен до строки printf.

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

Ответ 2

Оператор вместе с его операндами представляет собой простое выражение, которое называется полным выражением.

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

A подвыражение - это не просто часть большего выражения.

Рассмотрим:

2 * 3 + 4 * 5

Здесь 3 + 4 * 5 не является подвыражением.

Полное выражение анализирует как

(2 * 3) + (4 * 5)

и поэтому прямые подвыражения 2 * 3 и 4 * 5.

Каждый из них снова разбирается как композиции меньших вещей, с 2 * 3, состоящими из подвыражений 2 и 3, и с 4 * 5, состоящими из подвыражений 4 и 5.

Эти подвыражения подвыражений являются косвенными подвыражениями исходного полного выражения, так что в целом он имеет следующие подвыражения: 2*3, 4*5, 2, 3, 4 and 5.

Пока, например, 3+4*5 не является подвыражением.

Ответ 3

Рассмотрим приведенное ниже утверждение

a = b + c;

a = b + c - выражение, которое не является подвыражением любого большего выражения. Это называется полным выражением. b + c является подвыражением большего выражения a = b + c, поэтому оно не является полным выражением. b также является подвыражением для полного выражения a = b + c и подвыражения b + c.