为什么"true;"(和其他)是有效的代码行C++?

Why is "true;" (and others) a valid line of code C++?

本文关键字:有效 代码 C++ true 其他 为什么      更新时间:2023-10-16

添加true;/false;显然C++代码有效。它可以很好地编译和运行。

同样,对于像int;void;{}(no (((、1+1;1 == 1;,甚至只是1;这样的语句也是如此。为什么?(我正在使用视觉C++(

为什么不呢?语言规范明确指出C++中的表达式语句如下所示

<expression>;

这正是您在示例中所拥有的,例如 true;1 == 1;1; .

{}只是一个空的复合语句。

同时,int;格式不正确。如果编译器安静地接受它,它一定是某种特定于编译器的怪癖/错误/扩展。

false;true; 是有效的语句。它们分别评估为falsetrue,没有副作用。

但是,int;不是有效的声明。如果 VS 允许,那就是 VS 中的一个错误。

{};是一个空的复合语句或块语句{}和一个空的状态;。两者都是合法结构。

1 == 1;是一份法律声明。它评估为true并且没有副作用。

1;是一份法律声明。它评估为1并且没有副作用。

这些是有效的代码行,因为它们没有理由不这样做 - 事实上,对它们进行编程需要额外的努力,语言设计者不想经历额外的努力。(但是,在某些语言(如 C#(中,其中许多语言无效(。

C++将"语句"(行尾以分号结尾的东西(定义为几个特定的语句,例如return xthrow 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。