什么可以是子表达式

What can be a subexpression?

本文关键字:表达式 什么      更新时间:2023-10-16

我读了"C++。底漆加。斯蒂芬·普拉塔"(第6版)。第209页是:

y = (4 + x++) + (6 + x++);

表达式4 + x++不是完整的 表达式,因此C++不保证x会递增 在计算子表达式 4 + x++ 之后立即。在这里 完整表达式是整个赋值语句和分号 标记序列点,因此C++保证的只是x将 在程序移动到 以下声明。C++ 未指定x是否递增 在每个子表达式计算之后或仅在所有 表达式已被计算,这就是为什么您应该避免 这种声明。

我读了"序列点和表达评估"视觉系统杂志,2002年8月。克劳斯·克雷夫特和安吉丽卡·兰格。有:

 x[i]=i++ + 1; 

假设变量 i 在输入语句之前具有值1。 此表达式的评估结果是什么?正确的 答案是:我们不知道。 然而,程序员经常相信 他们知道这个程序片段的作用。典型答案 包括:"x[1]将具有值2",或" x[2]将具有值 2 ",甚至" x[1]将具有值3 "。

第三种选择肯定是错误的。这不会发生,因为i++ 是一个后缀增量,返回 i 的初始值 1 ;因此 赋值右侧的值是2,而且肯定 不是3.[...] 到目前为止一切顺利,但我们不知道 将修改数组x的哪个条目。 指数是1还是2 何时将右侧值分配给x[i]

这个问题没有明确的答案。这完全取决于 编译器计算子表达式的顺序。 如果 编译器从赋值的右侧开始并计算 i++ + 1,然后再确定数组中的哪个位置x必须位于 分配给然后x[2]将被修改,因为i已经 在计算子表达式的过程中递增 i++ 。 相反,如果编译器从左侧开始并图 它必须分配给数组x中的位置i,当时 仍将是位置1,然后评估右侧 我们最终会修改 x[1] . 两种结果是平等的 可能且同样正确。"

如何理解子表达式在哪里? 4 + x++6 + x++是子表达式,因为它们放在圆括号中? x[i]i++ + 1是子表达式?为什么?我对此很感兴趣,因为我想了解假设中可能发生副作用的地方。

分解一下,这条线

y = (4 + x++) + (6 + x++);

是一个表达式语句。这样的东西由一个表达式后跟一个;组成,所以

y = (4 + x++) + (6 + x++)

是一个表达式。

由于此表达式不是另一个表达式的一部分(而只是表达式语句的一部分),因此它是一个完整表达式另一方面,子表达式是作为另一个表达式一部分表达式。在下文中,我将使用大写字母来命名表达式,而不是C++标识符。

上面的完整表达式是以下形式的赋值表达式:

y = A

其中 A 是剩余的加法表达式

(4 + x++) + (6 + x++)

加法表达式的形式是X + Y,所以我们把它分解成两个表达式

(4 + x++)
(6 + x++)

第一个由形式 (Z) 的表达式组成,其中 Z 4 + x++4 + x++由两个表达式组成 4x++ .等等。所有这些表达式都是

y = (4 + x++) + (6 + x++)

因此它们是上述表达式的子表达式

什么是子表达式?

任何表达式都可以是子表达式。虽然,某些表达式可能不是某些其他表达式的子表达式。

4 + x++6 + x++是子表达式

正确。这两者都是算术表达式,更具体地说是加法。

因为它们在圆括号中?

嗯,有点。在括号内,它们确实是括号表达式的子表达式。

通常,它们是子表达式,因为它们是表达式,但也是另一个表达式的一部分。

x[i]i++ + 1是子表达式?为什么?

是的,他们是。请参阅

以下是 c++ 中所有可能表达式的方便列表。

让我们在 y = (4 + x++) + (6 + x++); 中找到子表达式。第一个没有子表达式的表达式是 4 。这是一个字面意思。它是4 + x++的子表达式,是加法。添加的形式为 A + B .在这种情况下,子表达式 A 4子表达式 B x++,这是一个后缀增量。哦,但这也包含一个子表达式:x .它是一个标识符,不包含子表达式。 4 + x++ 是括号表达式 (4 + x++) 的子表达式。这是(4 + x++) + (6 + x++)的子表达式,它是y = (4 + x++) + (6 + x++);的子表达式,这是一个赋值。赋值是一个完整的表达式 - 而不是一个子表达式。我留下了一些未探索的子表达,我将把它们留给读者练习。