【问题标题】:What is a full expression in C?什么是 C 中的完整表达式?
【发布时间】:2018-07-30 12:09:57
【问题描述】:

我从 Stephen Prata 的“C Primer Plus”一书中学习了 C 语言,它来到了重点:

"一个完整的表达式不是一个更大的表达式的子表达式 表达式。完整表达式的示例包括 表达式语句和用作测试条件的表达式 一个while循环”

我无法清楚地理解完整表达式的确切定义是什么,以及为什么书中认为测试条件是完整表达式。

任何人都可以清楚地解释“完整表达”是什么意思吗?我如何指定一个表达是否是完整表达?

【问题讨论】:

  • "完整表达式的示例包括表达式语句中的表达式"...wat?
  • 第一个短语的意思是,一个完整的表达式是最大的,而不是另一个表达式的子表达式。
  • 嗯,这对你的学习C没有太大影响。他试图解释的是一个“完整的表达”,最好是循环本身的while (condition) { /* ... stuff ... */ }语句我的阅读。这不是你应该失眠的术语,但要学会识别语句的完整范围等。见C11 - §6.8 Statements and blocks
  • 我不了解 C 书,但 Stephen Prata 的 C++ Primer Plus 书并没有受到高度评价。参见例如 .this review for some details.
  • @smac89 有个东西叫做“表达式语句”。它是一个表达式,可以选择后跟一个分号,实现语句的语义角色。也就是说,当你有一个表达式语句时,其中的表达式是一个完整的表达式。如果你有,比如if (x > 3) x = 2;,那么x = 2; 是一个表达式语句,因此其中的表达式 (x = 2) 是一个完整的表达式。

标签: c operators expression language-lawyer


【解决方案1】:

他直接取自 C 标准,例如 C11 6.8:

完整表达式是不属于另一个表达式或声明符的表达式。 下面的每一个都是一个完整的表达式:一个不属于复合的初始化器 文字;表达式语句中的表达式;选择的控制表达式 声明(ifswitch); whiledo 语句的控制表达式;每个 for 语句的(可选)表达式;返回中的(可选)表达式 陈述。在完整表达式的求值和 评估下一个要评估的完整表达式。

一些例子是:

if(x)

for(x; y; z)

return x;

其中 x y 和 z 是完整的表达式

完整表达式 是一个语言语法术语,并不是 C 程序员真正需要了解的内容。它只与“语言律师”和那些制作编译器或静态分析器的人有关。 C 标准谈​​到了语句完整表达式

程序员可能需要知道的是上面引用文本的最后几句,这意味着在一个完整的表达式之后,该表达式的所有副作用都会被执行。所以如果我写if(i++) printf("%d", i);之类的代码,那么我就知道i++已经在printf行之前执行了。

然而,在阅读编译器错误时了解这些枯燥的语法术语可能非常有用。比如臭名昭著的“statement missing”,用简单的英语来说,很可能意味着你忘记了一个分号。

【讨论】:

  • @Abd-ElrahmanMohamed 在谷歌中输入,答案就会揭晓。它是 20 年前在 C 中引入的一种语言特性——基本上它是一个本地范围的匿名对象。任何像样的 C 编程书籍都会解释它。
【解决方案2】:

一个运算符及其操作数构成一个简单的表达式,称为完整表达式

复合表达式可以通过使用更简单的表达式作为不同类型运算符的操作数来形成。表达式中运算符的计算顺序将由 C 语言中遵循的运算符优先规则决定。

子表达式不仅仅是更大表达式的任何部分。

考虑:

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 的子表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多