具有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库的一部分, using
和namespace
只是C ++关键字。 不要混淆语言,因为它们完全不相同。
另外,正如@sasquatch所提到的,在C语句中声明变量是非法的。
您不应该期望C ++代码在C中编译。您也不应该期望相反,因为C 不是 C ++的正确子集。
在C ++中 ,在while
循环的每次迭代之前测试condition
。 从C ++参考逐字:
condition
– 任何上下文可转换为bool
表达式或带有brace-or-equals初始值设定项的单个变量的declaration
。 在每次迭代之前计算此表达式,如果它产生false,则退出循环。 如果这是一个声明,则在每次迭代之前计算初始值设定项,如果声明的变量的值转换为false,则退出循环。
而在C中 ,在while
循环的每次迭代之前测试expression
。 从C引用逐字:
expression
–scalar
类型的任何表达式。 在每次迭代之前计算此表达式,如果它比较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
和相应的布尔文字false
和true
在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等。