什么是c ++中的表达式和表达式语句?

时间:2011-09-20 03:55:09

标签: c++

我读过,通常c ++中的语句以分号结尾;这可能有助于解释表达式语句是什么。但那你举一个例子,你会称之为表达式吗?

在这种情况下,只是语句或表达式语句或表达式吗?

int x;
x = 0;

7 个答案:

答案 0 :(得分:25)

这些是表达式(还记得数学吗?):

1
6 * 7
a + b * 3
sin(3) + 7
a > b
a ? 1 : 0
func()
mystring + gimmeAString() + std::string("\n")

以下是所有陈述:

int x;                            // Also a declaration.
x = 0;                            // Also an assignment.
if(expr) { /*...*/ }              // This is why it's called an "if-statement".
for(expr; expr; expr) { /*...*/ } // For-loop.

语句通常由表达式组成:

if(a > b)           // a > b is an expr.
    while(true)     // true is an expr.
        func();     // func() is an expr.

答案 1 :(得分:24)

表达式是“指定计算的运算符和操作数序列”(这是C ++标准中给出的定义)。示例包括422 + 2"hello, world"func("argument")。赋值是C ++中的表达式;函数调用也是如此。

我没有看到术语“声明”的定义,但基本上它是执行某些操作的一大块代码。示例是复合语句(由{ ... }中包含的零个或多个其他语句组成),if语句,goto语句,return语句和表达式语句。 (在C ++中,但不在C中,声明被归类为语句。)

术语语句表达式由语言语法非常精确地定义。

表达式语句是一种特殊的语句。它由一个可选表达式和一个分号组成。评估表达式并丢弃任何结果。通常这在语句有副作用时使用(否则没有多大意义),但你可以有一个表达式语句,其中表达式没有副作用。例如:

x = 42; // the expression happens to be an assignment

func("argument");

42; // no side effects, allowed but not useful

; // a null statement

null语句是一种特殊情况。 (我不确定为什么会这样对待;在我看来,它更适合作为一种消极的陈述。但这就是标准定义它的方式。)

请注意

return 42;

是一个语句,但不是表达式语句。它包含一个表达式,但表达式(加上;)不构成整个语句。

答案 2 :(得分:9)

要理解什么是表达式语句,首先应该知道什么是表达式,什么是语句。

编程语言中的表达式是编程语言解释的一个或多个显式值,常量,变量,运算符和函数的组合(根据其特定的优先权和关联规则)并计算产生(“返回”,在有状态的环境中)另一个价值。与数学表达式一样,此过程称为评估

来源:https://en.wikipedia.org/wiki/Expression_(computer_science)

换句话说,表达式是一种数据项。它们可以包含单个或多个实体,如常量和变量。这些实体可以由运营商相互关联或相互连接。表达可能有也可能没有副作用,因为它们通过改变状态的计算来评估某些东西。例如数字,看起来像数学公式和计算,赋值,函数调用,逻辑评估,字符串和字符串操作的东西都被认为是表达式。

函数调用:根据MSDN,函数调用被视为表达式。函数调用是一个表达式,它将控制和参数(如果有的话)传递给函数,并具有以下形式: 由expression (expression-list opt)函数运算符调用的( )

来源:https://msdn.microsoft.com/en-us/library/be6ftfba.aspx

表达式的一些例子是:

46
18 * 3 + 22 / 2
a = 4
b = a + 3
c = b * -2
abs(c)
b >= c
c
"a string"
str = "some string"
strcat(str, " some thing else")
str2 = "some string" + " some other string" // in C++11 using string library

语句是程序的片段,它们按顺序执行并使计算机执行某些明确的操作。一些C ++语句类型是:

  • 表达式声明;
  • 复合语句;
  • 选择陈述;
  • 迭代声明;
  • 跳转声明;
  • 声明声明;
  • 尝试阻止;
  • 原子和同步块(TM TS)。

来源:http://en.cppreference.com/w/cpp/language/statements

  

我读过c ++中通常用semicon结尾的语句;

通常!但不总是。考虑下面的一段代码,它是一个复合语句,但不以分号结尾,而是括在两个大括号之间:

{   // begining of a compound statement
    int x;    // A declaration statement
    int y;
    int z;
    x = 2;    // x = 2 is an expression, thus x = 2; with the trailing semicolon is an expression statement
    y = 2 * x + 5;
    if(y == 9) {    // A control statement
        z = 52;
    } else {        // A branching statement of a control statement
        z = 0;
    }
 }    // end of a compound statement

到目前为止,正如您可能猜测的那样,表达式语句是任何带有分号后跟分号的语句。根据MSDN, 表达式语句是一个导致表达式被计算的语句。由于表达式语句,不会发生控制或迭代的转移。

来源:https://msdn.microsoft.com/en-us/library/s7ytfs2k.aspx

表达式语句的一些示例:

x = 4;
y = x * x + 10;
radius = 5;
pi = 3.141593;
circumference = 2. * pi * radius;
area = pi * radius * radius;

因此,以下不能被视为表达式语句,因为它们通过调用函数将控制流转移到程序的另一部分:

printf("The control is passed to the printf function");
y = pow(x, 2);

副作用:副作用是指对状态的修改。例如更改变量的值,在显示用户界面中的菜单的磁盘上写入一些数据等

来源:https://en.wikipedia.org/wiki/Side_effect_(computer_science)

请注意,表达式语句不需要有副作用。那就是他们不必改变或修改任何状态。例如,如果我们将程序的控制流视为可以修改的状态,则使用以下表达式语句 不会对程序的控制流程产生任何副作用:

a = 8;
b = 10 + a;
k++;

以下表达式语句会产生副作用,因为它会将控制流传递给sqrt()函数,从而改变状态:

d = sqrt(a);    // The control flow is passed to sqrt() function

如果我们将变量的值视为状态,修改它将是副作用,因此上面的所有表达式语句都有副作用,因为它们都修改了状态。没有任何副作用的表达式语句不是很有用。请考虑以下表达式语句:

x = 7;  // This expression statement sets the value of x to 7
x;      // This expression statement is evaluated to 7 and does nothing useful 

在上面的示例中,x = 7;对我们来说是一个有用的表达式语句。它通过=赋值运算符将x的值设置为7。但x;评估为7,它没有做任何有用的事情。

答案 3 :(得分:3)

根据Bjarne Stroustrup Special(第3版)的C ++编程语言,语句基本上是任何声明,函数调用,赋值或条件。但是,如果你看一下语法,那要复杂得多。简单来说,表达式是任何数学或逻辑运算。

维基百科链接在他的回答中发布的确定也可以提供帮助。

答案 4 :(得分:1)

在我看来,

语句 *声明*代码块的用途。即我们说这段代码if(){}是一个if语句,或者这个x=42;是一个表达式语句。因此42;之类的代码不会产生任何瑕疵,因此,这不是*声明。

表达 是表示值的任何符号的合法组合(Credit to Webopedia);它结合了变量和常量来产生新的值(引自C编程语言的第2章)。因此,它也具有数学内涵。例如,42中的数字x=42;是一个表达式(x=42;不是表达式而是表达式语句),或func(x)是表达式,因为它将评估为某种形式。相反,int x;不是表达式,因为它不表示任何值。

答案 5 :(得分:0)

我认为技术手册中的excerpt最有用也很明确。

阅读段落,直到 1.4.2语句的开头足够有用。

答案 6 :(得分:-3)

表达式是语句的一部分,或者是语句本身。

int x;是一个陈述和表达。

请参阅:http://en.wikipedia.org/wiki/Expression_%28programming%29

http://en.wikipedia.org/wiki/Statement_%28programming%29