什么可以是子表达式
What can be a subexpression?
我读了"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++
由两个表达式组成 4
和 x++
.等等。所有这些表达式都是
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++);
的子表达式,这是一个赋值。赋值是一个完整的表达式 - 而不是一个子表达式。我留下了一些未探索的子表达,我将把它们留给读者练习。
- 这 4 个 lambda 表达式之间有什么区别?
- 表达式"b=(b-x)&x"是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 用C++编写正则表达式的正确方法是什么?
- &&对lambda表达式有什么好处?
- C++:匹配正则表达式,什么是匹配?
- 什么是正则表达式中无与伦比的匹配?
- 这个算术表达式是什么意思:A += B++ == 0 在 C++;
- 什么是潜在评估表达式?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 非模板化函数上的约束表达式有什么意义?
- 以下表达式的作用是什么:x = (a1,a2,..,n);
- 布尔表达式的值是什么
- C++ : 在 lambda 表达式中捕获的目的是什么?
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 这个正则表达式的括号以什么方式"mismatched"?
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 使用从不打算在常量表达式中使用的 constexpr 变量有什么好处吗?
- 有什么方法可以通过删除表达式安全地处理两次释放内存?
- 这是什么布尔运算?“表达式 * 布尔值”