【问题标题】:Explaining the difference between a statement and an expression in c++解释 C++ 中语句和表达式之间的区别
【发布时间】:2014-12-22 09:49:04
【问题描述】:

我正在尝试彻底理解语句表达式之间的区别
但即使在阅读了这个答案后我也觉得很困惑 Expression Versus Statement
看下面:

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

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

【问题讨论】:

  • &lt;&lt;cout 的预定义运算符。不要以语句和表达式为例 - 它更多的是 C++ 中预定义运算符的演示。看看printf 函数和普通表达式(带有变量和常量)。
  • @i486 称其为“预定义”具有误导性。它由库提供,而不是由语言提供。
  • @Poldie 我告诉过你读过那个答案>
  • @Poldie C# 和 C++ 是不同的语言。在将 C++ 问题标记为 C# 问题的重复问题之前,假设您已意识到差异,而不是让其他人填空。

标签: c++ expression


【解决方案1】:

让我们看看 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? " ;

是一个陈述。

【讨论】:

    【解决方案2】:

    哪个是正确的?

    两者:它是一个表达式语句。 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# 中将被视为无效。

    【讨论】:

      【解决方案3】:

      表达式的定义在C标准(6.5表达式)中给出

      1 表达式是一系列运算符和操作数,用于指定 计算一个值,或指定一个对象或函数,或 产生副作用,或执行其组合。 运算符的操作数的值计算是有序的 在算子结果的值计算之前。

      对于表达式语句,它们以分号结尾。这是C++中表达式语句的定义

      expression-statement:
      expression opt;
      

      缺少表达式的表达式语句称为 null 声明。

      相对于最后一句话,我想指出 C 和 C++ 之间的区别。在 C++ 中声明是语句,而在 C 中声明不是语句。因此,在 C++ 中,您可以在声明之前放置标签,而在 C 中,您可能不会这样做。因此,在 C 语言中,您必须在声明之前放置一个空语句。比较

      C++

      Label:
      int x;
      

      C

      Label: ;
      int x;
      

      【讨论】:

      • 操作员已经阅读了语法,在这里反刍是没有帮助的。与 C 进行卷积也没有帮助。
      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多