sha*_*oth 8 c++ compiler-construction
在C++中,可以编写以下任何语句:
10;
true;
someConstant; //if this is really an integer constant
Run Code Online (Sandbox Code Playgroud)
或类似的东西
int result = obtainResult();
result; // looks totally useless
Run Code Online (Sandbox Code Playgroud)
如果在某些配置中扩展为空字符串的宏稍后与result
变量一起使用,则后者可用于抑制编译器警告"变量已初始化但未引用"(VC++中的C4189).像这样:
int result = obtainResult();
result;
assert( result > 0 ); // assert is often expanded into an empty string in Release versions of code
Run Code Online (Sandbox Code Playgroud)
这些陈述的含义是什么?除编译器警告抑制外,如何使用它们?
Mag*_*off 26
这种陈述是对其他语言部分如何运作的逻辑扩展.考虑使用一个返回值的函数,例如int foo()
,它也有一些副作用.有时你只想要那些副作用发生,所以你写foo();
一个声明.
现在,虽然这看起来并不完全相同10;
,但函数调用迟早会评估为int,并且没有任何事情发生在int中,就像使用10;
.
同一问题的另一个例子是,既然你可以这样做a = b = 10;
,那意味着b = 10
必须进行评估10
,因此你不能在不产生必须被抑制的值的情况下进行分配.
能够将这些值写为语句只是构建语言的一种逻辑方式,但对于您提出的情况,为它提供编译器警告甚至可能是个好主意.
除非你用它来压制编译器警告;)
这些语句(在C++语法中称为表达式语句)是有效的,因为它们是表达式.
表达式都是计算某种值的结构,例如
我认为,为了保持语法简单,他们决定不区分那些实际上有副作用的表达式(例如函数调用或赋值)和那些不具有副作用的表达式.