我试图彻底理解语句和表达式之间的区别
但是,即使在阅读了这个答案之后,我发现它也令人困惑
Expression Versus Statement
看看以下内容:
std::cout << "Hello there? " ;
我可以说它是一个声明,因为它以 分号结尾 结尾但我也可以说
这是一个表达,因为我有一个 ostream ,一个 输出操作符 和一个 字符串字面
这个表达式产生的值是左手操作数
哪一个是正确的?
答案 0 :(得分:10)
让我们看看C ++语法可以告诉我们的内容:
statement:
labeled-statement
attribute-specifier-seq_opt expression-statement
attribute-specifier-seq_opt compount-statement
attribute-specifier-seq_opt selection-statement
attribute-specifier-seq_opt iteration-statement
attribute-specifier-seq_opt jump-statement
declaration-statement
attribute-specifier-seq_opt try-block
expression-statement:
expression_opt ';'
所以这是一个声明;特别是,一个“表达式语句”,它由一个(可能是空的)表达式后跟一个分号组成。换句话说,
std::cout << "Hello there? "
是一个表达式,而
std::cout << "Hello there? " ;
是一个声明。
答案 1 :(得分:5)
哪一个是正确的?
两者:它是一个表达式声明。 C和C ++允许您将表达式放入代码体中,添加分号并使其成为语句。
以下是一些例子:
x++; // post-increment produces a value which you could use
a = 5; // Assignment produces a value
max(a, b); // Call of a non-void function is an expression
2 + x; // This calculation has no side effects, but it is allowed
请注意,在C和C ++的特定情况下也是如此,但在其他语言的情况下可能不是这样。例如,上面列表中的最后一个表达式语句在Java或C#中将被视为无效。
答案 2 :(得分:2)
表达式的定义在C标准(6.5表达式)中给出
1表达式是指定的运算符和操作数序列 计算一个值,或指定一个对象或一个函数,或 产生副作用或执行其组合的副作用。 对运算符的操作数的值计算进行排序 在运算符结果的值计算之前。
至于表达式语句,它们以分号结束。这是C ++中表达式语句的定义
expression-statement:
expression opt;
和
表达式为missing的表达式语句称为null 言。
相对于最后一个引用,我想指出C和C ++之间的区别。在C ++声明中,语句在C声明中不是语句。因此,在C ++中,您可以在声明之前放置标签,而在C中则可能不会这样做。所以在C中你必须在声明之前放置一个空语句。比较
<强> C ++ 强>
Label:
int x;
<强> C 强>
Label: ;
int x;