在C++中,每个"语句"也是一个表达式吗?

Hin*_*sum 2 c++ expression language-lawyer difference

我可以说在C++中,每个语句(没有分号)也是一个表达式吗?

另外,所有表达式,添加分号,都可以成为一个声明?谢谢.

Bat*_*eba 7

表达,随后分号确实是一个expression_statement这是一种类型的语句.

但反过来不一定是真的:例如考虑jump_statement:

goto foo;

这里goto foo不是一个表达式.


Bas*_*tch 7

不,C++语句并不总是表达式.例如,for循环不是表达式(类型void).因此,即使使用逗号运算符,以下内容也是错误的:

 /// wrong code, syntactically incorrect in C++
 for (int i=0; i<5; i++) {std::cout<<i<<std::endl;}
 , // this is a comma operator
 x+3
Run Code Online (Sandbox Code Playgroud)

(你可以用任何其他运算符代替逗号运算符+,它仍然是错误的)

但是,表达式(包括赋值和调用)当然可以用作语句.

注意,GCC提供作为一种语言的扩展,语句exprs(和该扩展是由接受锵/ LLVM); 这是一个简单的例子(语句表达式的值由下式给出2*x):

#include <iostream>

void f (int x) {
   // notice the statement-expr starting inside ({ ... })
   // the last expression inside the braces gives the value
   int y = ({std::cout << "x=" << x << std::endl; 2*x;})+1;
   std::cout << "y=" << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

由于C++ 11编译器不接受该扩展,您可以创建一个带有lambda表达式的闭包并立即应用它以获得相同的效果:

void f (int x) {
  int y = ([=](){std::cout << "x=" << x << std::endl; return 2*x;})() + 1;
  std::cout << "y=" << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

希望优化编译器不会打扰创建中间闭包并生成相当于GCC可以g++ -O2用语句expr变量赋予的代码

有些语言,特别是Ocaml,Scheme,Haskell,没有语句或说明.他们只有表达式(其中一些可能有一些副作用).