【发布时间】:2018-09-26 11:13:49
【问题描述】:
当这不能在 C 中编译时我很困惑:
int main()
{
for (int i = 0; i < 4; ++i)
int a = 5; // A dependent statement may not be declaration
return 0;
}
我习惯于 C++ 编译。我只是目瞪口呆地呆了一会儿,直到我想起了一个关于 SO 的答案,关于 C 和 C++ 中不同的东西是如何被视为“语句”的。这是关于 switch 语句的。在 C 和 C++ 中,for 循环括号后的“语句”必须存在。这可以通过添加分号或创建 { } 波浪形括号块来完成。
在 C++ 中“int a = 7;”被认为是声明、定义和初始化。在 C 中,我相信它也被认为是所有这些,但是在 C 中,它不被视为“语句”。
有人能准确解释一下为什么在 C 中这不是一个语句,而在 C++ 中它是一个语句吗?这使我对语句是什么的概念感到困惑,因为一种语言说它是,而另一种语言说它不是,所以我有点困惑。
【问题讨论】:
-
@NathanOliver 我首先在我的 Visual Studio 2017 上注意到了 C 和 C++ 编译器,但我知道这不是一个很好的合规性示例,所以我在 onlinegdb.com 上进行了尝试,两者都进行了编译,这是一个示例,onlinegdb.com/SysJyUGnf 抱歉,不确定这是使用 GCC 还是什么。但是如果你切换到右上角的 C++,你会看到两者之间的区别。
-
您在寻找什么样的答案? C++ 委员会关于他们为什么决定做与 C 不同的事情的声明?
-
@melpomene 我开始明白这一点,一种语言中的一个定义不必在另一种语言中具有相同的定义,这就是为什么它是另一种语言的原因。只是在 C 和 C++ 中是如此相似,我希望像“语句”这样基本的东西是一个相似的概念,但这显然是一个很大的例外。我首先在一个非常流行的问题中注意到这一点,该问题是关于跳过 C 和 C++ switch 语句中的初始化。
-
C 有很多“方言”。最早的甚至根本不允许作用域变量。您必须在所有代码之前声明所有变量。例如,“K&R”C 就完全不同了。您应该说明您使用的是哪个版本的 C。 (C99 在现代编译器中最为常见)。
标签: c++ c if-statement language-lawyer