解释c ++中语句和表达式之间的区别

时间:2014-12-22 09:49:05

标签: c++ expression

我试图彻底理解语句表达式之间的区别 但是,即使在阅读了这个答案之后,我发现它也令人困惑 Expression Versus Statement
看看以下内容:

std::cout << "Hello there? " ;  

我可以说它是一个声明,因为它以 分号结尾 结尾但我也可以说
这是一个表达,因为我有一个 ostream ,一个 输出操作符 和一个 字符串字面
这个表达式产生的值是左手操作数 哪一个是正确的?

3 个答案:

答案 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;