栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言基本概念(4)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言基本概念(4)

本文来源:  

https://mp.weixin.qq.com/s/5zfb8WRmHnMF636cgvfkOQ

9. 整数类型(integer types)

关于整数,本公众号中已有多篇文章中探讨过,本文专门对计算整数时发生溢出问题的探讨。

详细内容请看:C语言中的数据类型

char类型、有符号和无符号整数类型以及枚举类型统称为整数类型。

整数类型有标准整数类型和扩展整数类型。

标准有符号整数类型和标准无符号整数类型统称为标准整数类型,扩展有符号整数类型和扩展无符号整数类型统称为扩展整数类型。

有五种标准的有符号整数类型,分别是signed char, short int, int, long int和long long int。也可能有实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。

对于每个有符号整数类型,都有一个对应的但不同的无符号整数类型,该类型使用相同的存储量,并且具有相同的对齐要求。

_Bool属于标准无符号整数类型,其长度(占用的字节数)取决于C实现,至少是1个字节。

与扩展有符号整数类型对应的无符号整数类型是扩展无符号整数类型。标准和扩展无符号整数类型统称为无符号整数类型。

char、signed char和unsigned char是三种不同的类型。char类型可能与signed char类型的行为一致,也可能与unsigned char类型的行为一致,这取决于具体的实现。

10.  整数溢出

对整数执行算术运算时,其结果有可能因为太大而无法表示。例如,对两个int值进行算术运算时,结果必须仍然能用int类型来表示,否则就会发生溢出。

整数溢出时的行为要根据操作数是否有符号来确定。有符号整数运算中发生溢出时,程序的行为是未定义的。关于未定义行为可以阅读公众号文章《未定义行为》,在该文中对未定义行为是这样描述的:未定义行为是一种非常严重的bug,当程序中出现未定义行为时,后果是不可预料的,我们应该像躲避瘟疫一样避免未定义的行为。或者说,未定义行为的结果是不确定的,这有悖于算法的确定性。在程序中发生未定义行为,最有可能的情况仅仅是计算结果出错,但程序有可能崩溃,或出现其他意想不到的状况。

无符号整数运算过程中发生溢出时,结果是有定义的,正确答案对2^n取模,其中n表示整数的二进制位数。

11. C标准库

标准C是由C语言标准和一组标准函数库组成。这些函数库支持字符和字符串、输入和输出、数学函数、日期和时间转换、动态存储分配以及其他各种服务的函数。每个函数库中的工具(类型、宏和函数)是由标准头文件所定义的。头文件的扩展名总是.h。为了使某个函数库中的工具可用于C程序文件,只需要将对应的标准头文件用#include预处理命令引用表示该函数库的头文件即可。

这些精心设计的库函数可以随C实现一起被移植到任何系统中,而使用这些库函数的程序基本不需要改动就可以转移到那些系统中继续转换和运行。

标准库定义了编写C程序时常常需要的常量、符号和函数。它还提供了C语言的一些可选扩展。取决于机器的特性,例如计算机的输入输出,由标准库以不依赖机器的形式实现。这意味着,在PC中用C代码把数据写入磁盘文件的方式,与在其他计算机上相同。尽管底层的硬件处理相当不同。库提供的标准功能包括大多数程序员都可能需要的功能,例如处理文本字符串或数学计算,这样就免除了自己实现这些功能所需的大量精力。

输入和输出并非C自身的一部分。为了方便地和程序的执行环境沟通,很多计算机程序设计语言都会配有某种形式的库,在这方面C语言也不例外。C的维护者们很早就将一些通用性的函数分离出来,形成了独立的库。所有依从标准C实现都必须实现这些库。

问题:结合操作系统知识,请回答为什么在大多数程序设计语言中没有提供输入输出语句?

12. void类型

void类型由一组空值(不存在的值)组成,它是一个不完整的数据对象类型,也无法使其成为完整的数据对象类型。

因为void不是完整的数据对象类型,所以不能声明void类型的数据对象。但可以在函数的声明中使用void作为参数类型和返回类型,以表示不接收任何参数或者不返回任何值。

类型为void的表达式简称为void表达式,它的值是不存在,因此,不得以任何方式使用,且不得隐式或显式转换(void除外)此类表达式的类型。如果将任何其他类型的表达式看作void表达式来计算,则其计算结果和类型将被丢弃,在这种情况下,void表达式仅副作用有效。

例如: (void) i++;   // 丢弃表达式的值,副作用是i自增1

void func(int);

int a;

a = func(2) + 2;  // 非法,func(2)的返回值不能使用

如果一个void 表达式没有副作用,那这个表达式没有任何意义。

可以创建指向void类型的指针。指针是完整的数据对象类型,所以指向void的指针也是完整的数据对象类型。可以将任何数据对象的指针转换为void指针,然后从void指针转换为原来的类型,这都是允许的。

指向void的指针应与指向字符类型的指针具有相同的表示和对齐要求。同样,指向兼容类型的限定性或非限定性版本的指针应具有相同的表示和对齐要求。指向结构类型的所有指针应具有彼此相同的表示和对齐要求。指向共用体类型的所有指针应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019459.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号