有效的C 代码的等效C代码不编译
The equivalent C code of a valid C++ code with a While loop does not compile
以下包含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库的一部分,using
和namespace
仅是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
和相应的布尔文字false
和true
在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等。
- 如何修复sfml c++代码编译错误
- 尝试用java代码编译和运行c++代码
- 此代码编译良好,但文件未创建?请指出错误
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 代码编译没有任何输出,入门程序
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- 无法使用 g++ 使用C++代码编译 C 库
- 如何在Ubuntu中使用Visual Studio代码编译C++代码
- 推力+提升代码编译错误
- C++代码编译,但在 Zorin OS 上运行时显示错误
- 如何在使用模板时将 CPP 代码编译到库文件中
- 是否可以将Visual Studio 2017将C 代码编译到EXE以外的文件类型中
- 使用 Visual Studio for C++ 代码编译错误
- 使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.
- 使用 Emscripten 将 OpenCV 代码编译C++ Javascript
- 将C 代码编译到独立应用程序.App
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- 重用编译器前端的结果,以加快多个配置/平台的C++代码编译
- 如何将C++11代码编译为网络汇编