在 C++ 中,每个 "statement" 也是一个表达式吗?
In C++, is each "statement" also an expression?
我能说在C++中,每个语句(不带分号)也是一个表达式吗?
还有,所有的表达式,加个分号,就可以变成语句了吗?
谢谢
一个表达式后跟一个分号确实是一个expression_statement,这是一种语句。
但反过来不一定成立:例如考虑 jump_statement:
goto foo;
此处goto foo
是不是表达式。
不,C++ 语句并不总是表达式。例如,for
循环不是表达式(void
类型)。所以即使使用 comma operator 以下内容也是错误的:
/// 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
(您可以将逗号运算符替换为任何其他运算符,如 +
,它仍然是错误的)
但是表达式(包括赋值和调用)当然可以用作语句。
注意GCC provides, as a language extension, statement exprs (and this extension is accepted by Clang/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;
}
由于 C++11 编译器不接受该扩展,您可以创建一个带有 lambda-expression 的闭包并立即应用它以获得等效效果:
void f (int x) {
int y = ([=](){std::cout << "x=" << x << std::endl; return 2*x;})() + 1;
std::cout << "y=" << y << std::endl;
}
希望优化编译器不会费心创建中间闭包并生成与 GCC 可以使用语句 expr variant
提供的代码(使用 g++ -O2
)等效的代码
有些语言,特别是 Ocaml、Scheme,Haskell 没有语句或说明。它们只有表达式(其中一些可能有一些副作用)。
没有
语句可以由任意数量的事物(包括表达式)组成,但语句本身不是表达式。
看看§A.5。
我能说在C++中,每个语句(不带分号)也是一个表达式吗?
还有,所有的表达式,加个分号,就可以变成语句了吗? 谢谢
一个表达式后跟一个分号确实是一个expression_statement,这是一种语句。
但反过来不一定成立:例如考虑 jump_statement:
goto foo;
此处goto foo
是不是表达式。
不,C++ 语句并不总是表达式。例如,for
循环不是表达式(void
类型)。所以即使使用 comma operator 以下内容也是错误的:
/// 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
(您可以将逗号运算符替换为任何其他运算符,如 +
,它仍然是错误的)
但是表达式(包括赋值和调用)当然可以用作语句。
注意GCC provides, as a language extension, statement exprs (and this extension is accepted by Clang/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;
}
由于 C++11 编译器不接受该扩展,您可以创建一个带有 lambda-expression 的闭包并立即应用它以获得等效效果:
void f (int x) {
int y = ([=](){std::cout << "x=" << x << std::endl; return 2*x;})() + 1;
std::cout << "y=" << y << std::endl;
}
希望优化编译器不会费心创建中间闭包并生成与 GCC 可以使用语句 expr variant
提供的代码(使用g++ -O2
)等效的代码
有些语言,特别是 Ocaml、Scheme,Haskell 没有语句或说明。它们只有表达式(其中一些可能有一些副作用)。
没有
语句可以由任意数量的事物(包括表达式)组成,但语句本身不是表达式。
看看§A.5。