邵阳网站建设制作,电子商务网站开发软件,个人网站备案需要多久,嫦娥直播点击蓝字关注我们来源于网络#xff0c;侵删1、前言在很大程度上#xff0c;C是C的超集#xff0c;这意味着一个有效的C程序也是一个有效的C程序。C和C的主要区别是#xff0c;C支持许多附加特性。但是#xff0c;C中有许多规则与C稍有不同。这些不同使得C程序作为C程序编…点击蓝字关注我们来源于网络侵删1、前言在很大程度上C是C的超集这意味着一个有效的C程序也是一个有效的C程序。C和C的主要区别是C支持许多附加特性。但是C中有许多规则与C稍有不同。这些不同使得C程序作为C程序编译时可能以不同的方式运行或根本不能运行。本节着重讨论这些区别。如果使用C的编译器编译C程序就知道这些不同之处。虽然C和C的区别对本书的示例影响很小但如果把C代码作为C程序编译的话会导致产生错误的消息。C99标准的发布使得问题更加复杂因为有些情况下使得C更接近C。例如C99标准允许在代码中的任意处进行声明而且可以识别//注释指示符。在其他方面C99使其与C的差异变大。例如新增了变长数组和关键字restrict。C11缩小了与C的差异。例如引进了char16_t类型新增了关键字_Alignas新增了alignas宏与C的关键字匹配。C11仍处于起步阶段许多编译器开发商甚至都没有完全支持C99。我们要了解C90、C99、C11之间的区别还要了解C11与这些标准之间的区别以及每个标准与C标准之间的区别。这部分主要讨论C99、C11和C之间的区别。当然C也正在发展因此C和C的异同也在不断变化。2、函数原型在C中函数原型必不可少但是在C中是可选的。这一区别在声明一个函数时让函数名后面的圆括号为空就可以看出来。在C中空圆括号说明这是前置原型但是在C中则说明该函数没有参数。也就是说在C中intslice()和int slice(void)相同。例如下面旧风格的代码在C中可以接受但是在C中会产生错误int slice();
int main()
{...slice(20, 50);...
}
int slice(int a, int b)
{...
}在C中编译器假定用户使用旧风格声明函数。在C中编译器假定slice()与slice(void)相同且未声明slice(intint)函数。另外C允许用户声明多个同名函数只要它们的参数列表不同即可。3、char常量C把char常量视为int类型而C将其视为char类型。例如考虑下面的语句char ch A;在C中常量A被储存在int大小的内存块中更精确地说字符编码被储存为一个int类型的值。相同的数值也储存在变量ch中但是在ch中该值只占内存的1字节。在C中A和ch都占用1字节。它们的区别不会影响本书中的示例。但是有些C程序利用Char常量被视为int类型这一特性用字符来表示整数值。例如如果一个系统中的int是4字节就可以这样编写C代码int x ABCD; /*对于int是4字节的系统该语句出现在C程序中没问题但是出现在C程序中会出错 */ABCD表示一个4字节的int类型值其中第1个字节储存A的字符编码第2个字节储存B的字符编码以此类推。注意ABCD和ABCD不同。前者只是书写int类型值的一种方式而后者是一个字符串它对应一个5字节内存块的地址。考虑下面的代码int x ABCD;
char c ABCD;
printf(%d %d %c %c\n, x, ABCD, c, ABCD);在我们的系统中得到的输出如下1094861636 1094861636 D D该例说明如果把ABCD视为int类型它是一个4字节的整数值。但是如果将其视为char类型程序只使用最后一个字节。在我们的系统中尝试用%s转换说明打印ABCD会导致程序崩溃因为ABCD的数值(1094861636) 已超出该类型可表示的范围。可以这样使用的原因是C提供了一种方法可单独设置int类型中的每个字节因为每个字符都对应一个字节。但是由于要依赖特定的字符编码所以更好的方法是使用十六进制的整型常量因为每两位十六进制数对应一个字节。第15章详细介绍过相关内容(C的早期版本不提供十六进制记法这也许是多字符常量技术首先得到发展的原因)。4、const限定符在C中全局的const具有外部链接但是在C中具有内部链接。也就是说下面C的声明const double PI 3.14159;相当于下面C中的声明static const double PI 3.14159;假设这两条声明都在所有函数的外部。C规则的意图是为了在头文件更加方便地使用const。如果const变量是内部链接每个包含该头文件的文件都会获得一份const变量的备份。如果const变量是外部链接就必须在一个文件中进行定义式声明然后在其他文件中使用关键字extern进行引用式声明。顺带一提C可以使用关键字extern使一个const值具有外部链接。所以两种语言都可以创建内部链接和外部链接的const变量。它们的区别在于默认使用哪种链接。另外在C中可以用const来声明普通数组的大小const int ARSIZE 100;double loons[ARSIZE]; /* 在C中与double loons[100];相同 */当然也可以在C99中使用相同的声明不过这样的声明会创建一个变长数组。在C中可以使用const值来初始化其他const变量但是在C中不能这样做const double RATE 0.06; // C和C都可以const double STEP 24.5; // C和C都可以const double LEVEL RATE * STEP; // C可以C不可以5、结构和联合声明一个有标记的结构或联合后就可以在C中使用这个标记作为类型名struct duo{ int a; int b;};struct duo m; /* C和C都可以 */duo n; /* C不可以C可以*/结果是结构名会与变量名冲突。例如下面的程序可作为C程序编译但是作为C程序编译时会失败。因为C把printf()语句中的duo解释成结构类型而不是外部变量#includefloat duo 100.3;int main(void){ struct duo { int a; int b;}; struct duo y { 2, 4}; printf (%f\n, duo); /* 在C中没问题但是在C不行 */ return 0;}在C和C中都可以在一个结构的内部声明另一个结构struct box
{struct point {int x; int y; } upperleft;struct point lowerright;
};在C中随后可以使用任意使用这些结构但是在C中使用嵌套结构时要使用一个特殊的符号struct box ad; /* C和 C都可以 */
struct point dot; /* C可以C不行 */
box::point dot; /* C不行C可以 */6、枚举C使用枚举比C严格。特别是只能把enum常量赋给enum变量然后把变量与其他值作比较。不经过显式强制类型转换不能把int类型值赋给enum变量而且也不能递增一个enum变量。下面的代码说明了这些问题enum sample {sage, thyme, salt, pepper};enum sample season;season sage; /* C和C都可以 */season 2; /* 在C中会发出警告在C中是一个错误 */season (enum sample) 3; /* C和C都可以*/season; /* C可以在C中是一个错误 */另外在C中不使用关键字enum也可以声明枚举变量enum sample {sage, thyme, salt, pepper};
sample season; /* C可以在C中不可以 */与结构和联合的情况类似如果一个变量和enum类型的同名会导致名称冲突。7、指向void的指针C可以把任意类型的指针赋给指向void的指针这点与C相同。但是不同的是只有使用显式强制类型转换才能把指向void的指针赋给其他类型的指针。下面的代码说明了这一点int ar[5] {4, 5, 6,7, 8};int * pi;void * pv;pv ar; /* C和C都可以 */pi pv; /* C可以C不可以 */pi (int * ) pv; /* C和C都可以 */C与C的另一个区别是C可以把派生类对象的地址赋给基类指针但是在C中没有这里涉及的特性。8、布尔类型在C中布尔类型是bool而且ture和false都是关键字。在C中布尔类型是_Bool但是要包含stdbool.h头文件才可以使用bool、true和false。9、可选拼写在C中可以用or来代替||还有一些其他的可选拼写它们都是关键字。在C99和C11中这些可选拼写都被定义为宏要包含iso646.h才能使用它们。10、宽字符支持在C中wchar_t是内置类型而且wchar_t是关键字。在C99和C11中wchar_t类型被定义在多个头文件中(stddef.h、stdlib.h、wchar.h、wctype.h)。与此类似char16_t和char32_t都是C11的关键字但是在C11中它们都定义在uchar.h头文件中。C通过iostream头文件提供宽字符I/O支持(wchar_t、char16_t和char32_t)而C99通过wchar.h头文件提供一种完全不同的I/O支持包。11、复数类型C在complex头文件中提供一个复数类来支持复数类型。C有内置的复数类型并通过complex.h头文件来支持。这两种方法区别很大不兼容。C更关心数值计算社区提出的需求。12、内联函数C99支持了C的内联函数特性。但是C99的实现更加灵活。在C中内联函数默认是内部链接。在C中如果一个内联函数多次出现在多个文件中该函数的定义必须相同而且要使用相同的语言记号。例如不允许在一个文件的定义中使用int类型形参而在另一个文件的定义中使用int32_t类型形参。即使用typedef把int32_t定义为int也不能这样做。但是在C中可以这样做。C允许混合使用内联定义和外部定义而C不允许。13、C11中没有的C99/C11特性虽然在过去C或多或少可以看作是C的子集但是C99标准增加了一些C没有的新特性。下面列出了一些只有C99/C11中才有的特性指定初始化器受限指针Restricted pointer) 即restric指针)变长数组伸缩型数组成员带可变数量参数的宏。如果你年满18周岁以上又觉得学【C语言】太难想尝试其他编程语言那么我推荐你学Python现有价值499元Python零基础课程限时免费领取限10个名额▲扫描二维码-免费领取戳“阅读原文”我们一起进步