有效的C 代码的等效C代码不编译

The equivalent C code of a valid C++ code with a While loop does not compile

本文关键字:代码 编译 有效      更新时间:2023-10-16

以下包含while循环的代码编译了C 。

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

但是,如果在c:

中编译,以下等效的C代码会导致错误
#include <stdio.h>
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 是不同的语言。<iostream>不是C库的一部分,usingnamespace仅是C 关键字。不要混合语言,因为它们完全不一样。

另外,正如@sasquatch提到的,在C中声明while条件中的变量是非法的。

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

c 中,在while循环的每次迭代之前都对condition进行了测试。C 的逐字参考:

condition-任何在上下文转换为上下文的表达式 bool或单个变量的declaration,带有支撑或equals 初始化器。在每次迭代之前对此表达进行评估,并且 如果产生错误,则循环将退出。如果这是声明, 在每次迭代之前对初始化器进行评估,以及 声明的变量转换为false,循环退出。

虽然在 c 中,在while循环的每次迭代之前都对expression进行了测试。逐字参考:

expression- scalar类型的任何表达式。这个表达是 在每次迭代之前进行评估,如果比较等于zero, 循环退出。

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

这篇文章涵盖了C与C 的期望。他们解释的同一规则也适用于一段时间。

在c 和c。

中的定义有差异

在c 中,定义了以下方式

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 程序中,声明条件的初始化器值等于5

while (int i = 5)

,由于它不等于零,然后将其转换为布尔 true

在c中定义了以下方式

while ( expression ) statement

您可以在这里明确指定自己只能使用表达式。C不允许在While语句中使用声明。所以这个语句

while (int i = 5)

不会在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 中缺少的化合物文字。或在C 中,C 的语句范围在C等中不存在。:)

您上述代码有多个问题。

首先,您可能想摆脱名称空间和标题。它们甚至没有在代码中使用,也无法由C编译器读取。

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

最后,尽管我相信C 标准允许您在一定的声明中定义一个变量,但我强烈建议您不要这样做。将比较语句与可变定义混合在一起的半混乱,即:int x,bool y,double z等。