首页 > 解决方案 > 我想详细了解 C++ 中表达式和语句之间的区别。请选择具体的例子来解释

问题描述

现在我正在学习 C++ 编程。我不明白表达式、定义、声明和定义之间的区别。

正如维基百科所说,

在“声明(计算机科学)”中

在大多数语言中,语句与表达式的不同之处在于语句不返回结果并且仅因其副作用而执行,而表达式总是返回结果并且通常根本没有副作用。

在“表达(计算机科学)”页面

在许多编程语言中,函数以及包含函数的表达式可能具有副作用。具有副作用的表达式通常不具有引用透明性的属性。在许多语言(例如 C++)中,表达式可以以分号 (;) 结束,以将表达式转换为表达式语句。这要求实现仅评估表达式的副作用并忽略表达式的结果(例如“x+1;”),除非它是引起副作用的表达式语句的一部分(例如“y= x+1;" 或 "func1(func2());")。注意事项

具体来说,这里的“副作用”和“结果”是什么意思?

帮助我,C++ 极客!

标签: c++expressioncomputer-sciencedeclarationdefinition

解决方案


具体来说,这里的“副作用”和“结果”是什么意思?

表达式没有副作用,从源代码中删除它不会改变程序语义。

int main(void) {
   int x = 1, y = 2, z = 0;
   // x+y expression calculates sum and ignores resulting answer 
   // NO SIDE EFFECTS, can be removed
   x+y; 
   // x+y expression calculates sum, but then 15 is assigned to z as a result 
   // SIDE EFFECT is that removing given expression breaks program syntax - can't be removed 
   z = (x+y, 15);
}

编辑

顺便说一句,请记住,并非所有表达式语句也都有副作用。例如x=x;,在技术上等同于;- 在汇编级别编译为 NOP 或完全被 GCC 优化器跳过的空语句。所以这些类型的表达式语句没有副作用,可以安全地从程序中删除。但这并不意味着您可以在不更改程序逻辑的情况下删除每个空语句。例如在这个片段中:
for (i=0; i < 10; i++);
这里 NOP 在每个 CPU 周期执行,所以如果你将它删除 - 程序语义将彻底改变。


推荐阅读