为什么"true;"(和其他)是有效的代码行C++?
Why is "true;" (and others) a valid line of code C++?
添加true;
/false;
显然C++代码有效。它可以很好地编译和运行。
同样,对于像int;
、void;
、{}
(no (((、1+1;
、1 == 1;
,甚至只是1;
这样的语句也是如此。为什么?(我正在使用视觉C++(
为什么不呢?语言规范明确指出C++中的表达式语句如下所示
<expression>;
这正是您在示例中所拥有的,例如 true;
或 1 == 1;
或 1;
.
{}
只是一个空的复合语句。
同时,int;
格式不正确。如果编译器安静地接受它,它一定是某种特定于编译器的怪癖/错误/扩展。
false;
和 true;
是有效的语句。它们分别评估为false
和true
,没有副作用。
但是,int;
不是有效的声明。如果 VS 允许,那就是 VS 中的一个错误。
{};
是一个空的复合语句或块语句{}
和一个空的状态;
。两者都是合法结构。
1 == 1;
是一份法律声明。它评估为true
并且没有副作用。
1;
是一份法律声明。它评估为1
并且没有副作用。
这些是有效的代码行,因为它们没有理由不这样做 - 事实上,对它们进行编程需要额外的努力,语言设计者不想经历额外的努力。(但是,在某些语言(如 C#(中,其中许多语言无效(。
C++将"语句"(行尾以分号结尾的东西(定义为几个特定的语句,例如return x
或throw y
或任何表达式。必须允许表达式,以便 foo();
等语句有效。语言设计者可以显式定义一个语句来包含函数调用和其他一些内容,而不是只包含任何表达式,但是只说任何表达式更容易。这包括true;
、false;
、1+1;
、1==1;
、1;
等。
在大括号的情况下,实际上允许(有时很有用(制作没有关联if
/while
/for
/等的大括号。他们声明一个新的范围。例如,以下打印2
:
void foo() {
int x = 2;
{
int x = 3;
}
cout<<x<<endl; //prints 2
}
语言规范可以(大致(表示为称为上下文无关语法的东西,您可以在维基百科上找到有关此的更多信息。
void;
,int;
如前所述格式不正确(让我们把这些排除在外(。
静态分析器和代码检查工具将通知您其余表达式毫无意义或可能错误。一些C++编译器甚至会发出警告。
C++接受这些东西的原因是 C 语法也接受了它们,并且这种遗产被继承了下来。关于">为什么C语言接受它们?"答案很简单,该语言有许多"编译器驱动"的部分,即为了简化编译器编写者的工作。
在《Deep C的秘密》一书中有一个很好的例子,标题为">2000万美元的虫子",结果是一句话:
x == 2;
一个完全没有意义的陈述,应该是一个任务;没有警告没有错误(在他们发现错误之前没有钱(
如果你的函数返回值 0 或 1(基本上是任何数字((真/假(或表达式可以被计算,那么它将导致 true 或 false:
例如,如果您编写:
int func() {
return true;
}
while ( func() ) {
...
}
它将使用 true。
- GCC对可能有效的代码抛出init list生存期警告
- 这是什么代码?为什么它有效?C++
- 为什么此代码片段有效?如何取消引用空点?
- 使用C++字谜代码仅在有时有效
- 为什么以下代码在在线 ide(gcc 7.2.0) 上有效,但在 ubuntu 上出现错误?
- 为什么第二个代码有效而第一个代码无效?
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?
- 代码 C++ 以添加前缀关键字以使其有效
- 为什么这个简短的模板代码片段有效
- 如何有效地处理Teamcenter ITK C++代码中的错误
- 这是有效的C++代码吗?(在声明范围之外使用本地类型)
- 以有效的方式从 Node .js运行 C 或C++代码
- 使用std ::函数时运行时异常.他们为什么不指向有效的代码
- 为什么认为参考文献在C 底漆第5个中没有变化,以下代码有效
- (C++)比较两段代码,一段有效,一段无效,无法找出区别
- 为什么这段代码在Visual Studio中有效,但在gcc中失败
- 通用lambda,继承和尾随返回类型:此有效代码
- 正在使用 std::time 和 std::srand 有效代码
- 用于确定两个数字中哪个较大的有效代码
- 有效代码无法通过visual studio 2015编译(std函数错误?)