为什么 "true;" (和其他人)是有效的 C++ 代码行?
Why is "true;" (and others) a valid line of code C++?
添加 true;
/ false;
显然是有效的 C++ 代码。它编译并运行得很好。
同样,对于int;
、void;
、{}
(无())、1+1;
、1 == 1;
或甚至只是 1;
... 为什么? (我使用的是 Visual C++)
为什么不呢?语言规范明确指出,C++中的表达式语句如下所示
<expression>;
这正是您在 true;
或 1 == 1;
或 1;
等示例中所拥有的。
{}
只是一个空的复合语句。
同时,int;
格式错误。如果编译器安静地接受它,它一定是某种编译器特定的 quirk/bug/extension.
false;
和 true;
是有效的语句。它们的计算结果分别为 false
和 true
,并且没有副作用。
然而,int;
不是一个有效的陈述。如果 VS 允许,那是 VS 中的一个错误。
{};
是一个空的复合或块语句 {}
和一个空的 statemet ;
。两者都是合法的构造。
1 == 1;
是一个合法的声明。它的计算结果为 true
并且没有副作用。
1;
是一个合法的声明。它的计算结果为 1
并且没有副作用。
如果您的函数 return 值 0 或 1(基本上是任何数字)(true / false) 或表达式可以求值,那么它将导致 true 或 false:
例如,如果你写:
int func() {
return true;
}
while ( func() ) {
...
}
它将使用 true。
这些都是有效的代码行,因为没有理由不让它们成为 - 事实上,将它们编程为不成为它们需要付出额外的努力,而语言设计者不想经历这种额外的努力. (但是,在某些语言(例如 C#)中,其中许多无效)。
C++ 将 "statement"(行尾以分号终止的内容)定义为一些特定的语句,例如 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 会接受它们?”,答案很简单,该语言有许多部分是 "compiler driven" 即为简化编译器编写者的工作而设计的。
书 'Deep C secrets' 中有一个很好的例子,标题为“2000 万美元的错误”,结果是一行:
x == 2;
一个完全没有意义的陈述,应该是一个作业;没有警告没有错误(在他们发现错误之前没有钱)
添加 true;
/ false;
显然是有效的 C++ 代码。它编译并运行得很好。
同样,对于int;
、void;
、{}
(无())、1+1;
、1 == 1;
或甚至只是 1;
... 为什么? (我使用的是 Visual C++)
为什么不呢?语言规范明确指出,C++中的表达式语句如下所示
<expression>;
这正是您在 true;
或 1 == 1;
或 1;
等示例中所拥有的。
{}
只是一个空的复合语句。
同时,int;
格式错误。如果编译器安静地接受它,它一定是某种编译器特定的 quirk/bug/extension.
false;
和 true;
是有效的语句。它们的计算结果分别为 false
和 true
,并且没有副作用。
然而,int;
不是一个有效的陈述。如果 VS 允许,那是 VS 中的一个错误。
{};
是一个空的复合或块语句 {}
和一个空的 statemet ;
。两者都是合法的构造。
1 == 1;
是一个合法的声明。它的计算结果为 true
并且没有副作用。
1;
是一个合法的声明。它的计算结果为 1
并且没有副作用。
如果您的函数 return 值 0 或 1(基本上是任何数字)(true / false) 或表达式可以求值,那么它将导致 true 或 false:
例如,如果你写:
int func() {
return true;
}
while ( func() ) {
...
}
它将使用 true。
这些都是有效的代码行,因为没有理由不让它们成为 - 事实上,将它们编程为不成为它们需要付出额外的努力,而语言设计者不想经历这种额外的努力. (但是,在某些语言(例如 C#)中,其中许多无效)。
C++ 将 "statement"(行尾以分号终止的内容)定义为一些特定的语句,例如 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 会接受它们?”,答案很简单,该语言有许多部分是 "compiler driven" 即为简化编译器编写者的工作而设计的。
书 'Deep C secrets' 中有一个很好的例子,标题为“2000 万美元的错误”,结果是一行:
x == 2;
一个完全没有意义的陈述,应该是一个作业;没有警告没有错误(在他们发现错误之前没有钱)