具有While循环的有效C ++代码的等效C代码无法编译

包含while循环的以下代码在C ++中编译。

 #include  using namespace std; int main() { while (int i = 5) { break; } return 0; } 

但是,如果在C中编译,则以下等效的C代码会导致错误:

 #include  int main() { while (int i = 5) { break; } return 0; } 

编译器输出:

 > prog.c: In function 'main': prog.c:5:9: error: expected expression > before 'int' while (int i = 5)prog.c: In function 'main': > prog.c:5:9: error: expected expression before 'int' while (int i = > 5) 

为什么会这样? 我试图在C中查找while循环的文档,但是也无法找到它。

C和C ++是不同的语言。 不是C库的一部分, usingnamespace只是C ++关键字。 不要混淆语言,因为它们完全不相同。

另外,正如@sasquatch所提到的,在C语句中声明变量是非法的。

您不应该期望C ++代码在C中编译。您也不应该期望相反,因为C 不是 C ++的正确子集。

C ++中 ,在while循环的每次迭代之前测试condition 。 从C ++参考逐字:

condition – 任何上下文可转换为bool表达式或带有brace-or-equals初始值设定项的单个变量的declaration 。 在每次迭代之前计算此表达式,如果它产生false,则退出循环。 如果这是一个声明,则在每次迭代之前计算初始值设定项,如果声明的变量的值转换为false,则退出循环。

而在C中 ,在while循环的每次迭代之前测试expression 。 从C引用逐字:

expressionscalar类型的任何表达式。 在每次迭代之前计算此表达式,如果它比较zero ,则退出循环。

在C中,while期望括号内的表达式。 你拥有的是变量的声明。 您必须在循环之前声明变量,然后将表达式写为i == 5以在C中编译。

这篇文章更详细地介绍了C与C ++相比所期望的内容。 他们为if解释的相同规则也适用于一段时间。

C ++和C中的while语句的定义有所不同。

在C ++中,while语句按以下方式定义

 while ( condition ) statement 

反过来,条件定义为

 condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list 

正如您可以从表达式中看到的那样,条件可能是带有一些初始化器的声明。 将ibitializer的值转换为bool类型的表达式,并根据布尔值执行while语句。

因此,在您的C ++程序中,while语句条件中声明的初始值设定项的值等于5

 while (int i = 5) 

因为它不等于零,所以它被转换为布尔值true

在C中,while语句按以下方式定义

 while ( expression ) statement 

正如您在此处所看到的那样,明确指出只能使用表达式。 C不允许在while语句中使用声明。 所以这句话

 while (int i = 5) 

不会用C编译。

它不是C ++和C之间的唯一区别。例如,下面的这个条件运算符将用C ++编译,不会用C编译

 int x = 10; int y = 20; ( x < y ? x : y ) = 20; 

或者此语句将使用C ++编译,不会在C中编译

 int x; int y = 20; ++( x = y ); 

下面的代码片段将在C ++和C中产生不同的结果

 if ( sizeof( 'A' ) == 1 ) puts( "They are equal" ); else puts( 'They are not equal" ); 

或者考虑以下示例

 int x = 10; void *vp = &x; int *ip; ip = vp; 

此代码段将在C中编译,不会在C ++中编译。 所以你应该谨慎。

而且C和C ++甚至有不同的基本类型。 例如,在C中,存在C ++中不存在的整数类型_Bool 。 另一方面,在C ++中有类型bool和相应的布尔文字falsetrue在C中不存在。在C ++中有指针文字nullptr在C中不存在。或者在C中有C ++中不存在的复合文字。 或者在C ++中,有基于for语句的范围在C中不存在等等。:)

您上面的代码存在多个问题。

首先,您可能想要删除名称空间和标题。 它们甚至没有在代码中使用,也不能被c编译器读取。

其次,您无法在任何循环命令中定义变量类型。 例如,while(int i!= 5)和for(int i = 0 …)在c中无效。 您必须在循环之前定义变量。

最后,虽然我相信c ++标准允许你在while语句中定义变量,但我强烈建议不要这样做。 它的半混淆是将比较语句与变量定义混合,即:int x,bool y,double z等。