C语言快速入门手册2.类型与表达式

2.1.操作过程

在“cex002.c”文件中输入以下代码并保存。

编译代码,运行程序。

程序运行起来之后,需要输入一行数据后按回车键,本例中输入的“12+33”程序识别出来以后按照指定的格式输出。

“scanf”函数是C语言标准输入函数,输入基本类型变量时需要加上取地址符前缀“&”,漏掉这个符号会出现异常情况。

“scanf”和“printf”函数后面的字符串,是格式化的输入输出,其中“%c”指定字符类型,“%d”指定整型,“%f”指定单精度值,“%lf”指定双精度值。

2.2.数据类型与尺寸

C语言的基本数据类型用于处理整数与浮点数,还可以表示单字节字符与双字节字符。

char是单字节字符型,可表示的整数范围是-128~127,表示的字符有各种大小写英文字母、阿拉伯数字与英文标点符号以及各种不可见字符,具体可查阅ASCII码表。

int是整型,尺寸取决于主机类型,一般地32位及以上机型为4字节,可表示的整数范围是- 231 ~ 231-1。

这两种最常用,基本足够解决一般的编程需要。其它的整数类型与尺寸约定,届时和C标准库一起综合讨论。

所有这些类型都有符号与无符号之分。有符号的signed char简写为char,有符号的signed int简写为int。对应的无符号类型是unsigned int,可表示的整数范围是0~ 232 -1,unsigned char可表示的整数范围是0~255,作为字符时用法跟char没有区别。

这些类型进行整数运算时,结果类型是占用字节数更多的类型。比如char与int运算结果为int。

enum是枚举类型,也可以作为整数处理。

旧标准的C语言没有布尔类型,用整型代替,0是假,1是真,虽然其它非0值都是真,但一般建议统一用1来表示。

浮点数类型有低精度类型float、高精度类型double。同样地,整数与浮点数的运算结果是浮点数,float类型与double类型运算结果为double类型。

2.3.变量与常量

变量的定义要在其它语句之前,由类型与标识符构成,并可以在定义中进行变量初始化。

标识符采用1~63字符表示,第一个字符必须是英文大小写字母或者下划线“_”,之后可以是字母、下划线与阿拉伯数字的组合,且不能使用C语言的关键字。C语言的关键字可以查阅列表,一般可以在学习当中慢慢积累。

常量的一种形式是立即数/立即常量,比如:-1、0、'0'、3.1415926。

下面定义的变量,一部分进行了初始化。

注意常量'\0' ASCII码值(整数值)为0,与'0'(ASCII码值32)不同,此格式表明char常量;立即数0作为常量用来初始化变量inum2。

浮点数常量“0.0F”为单精度值,“0.0L”为双精度值,不指定精度的“0.0”由编译器来决定精度。

这里还提供了一种科学计数法格式的常量“1.2E-10”,表示1.2×10−10 。

下面的运行结果表明,浮点数的精度存在误差,输入的π值输出“3.141593”。

上面的例子可以看到char以“%d”格式输出它的ASCII码值,区别于“%c”格式,但在输入时千万不可用“%d”格式。

定义常量就是在定义变量的形式之前冠以“const”修饰,还有定义的枚举类型,都可以作为常量使用。

enum列表中的枚举量也可以作为常量,下面的枚举类型Week表示星期,Monday指定为1,如果不指定的话第一个默认是0,后面逐个递增1,到Sunday为7。枚举类型主要是限定变量取值范围为有限的值,同时也增加了代码的可读性。

由下面的输出结果可以得到验证:

宏定义也可以用来代替常量,宏定义的作用是使用预处理语句“#define”进行文本的宏替换。

2.4.表达式

在“cex003.c”文件中输入以下代码并保存。

编译代码,运行程序。

本例中新出现了一个头文件“math.h”,这是标准库里面的数学库,库函数fabs就来自这个库,功能是取浮点数的绝对值。

C语言有算术操作符、关系操作符和逻辑操作符等。

C语言有赋值表达式、关系表达式、逻辑表达式等。C语言有各种非常灵活的表达式组合,但是容易出错,所以要小心使用。

表达式的操作符规定了对应的优先级,可以查阅相关资料,但也可不必注重于优先级顺序,我们可以像学习自然语言那样,培养出一定的语感。比如,“a = b + c”必然是加法结果的赋值语句,对于一些容易混淆的场景,建议都加上优先级最高的括号以绝后患。

C语言允许用变量或表达式来初始化另一个变量,用来初始化的变量必须是在本行之前已经定义好的。注意到方框内的部分实际上是一个赋值表达式,C语言所有的表达式都有值,赋值表达式的值就是变量/常量值本身。

初学者要仔细体会这种表达式,如果按照数学知识来理解,会造成混乱思维。因为开始可能ch等于'A',这下又等于'0',到底是哪个,这在数学上是不成立的。但是要想清楚,C语言里的变量实际上是一个存储单元,它可以存储'A',也可以存储'0',运行语句之后它就可能会改变。学习过程中将会对这种存储的概念越来越清晰,从一开始的不适应到最后的得心应手,需要一个过程。

第10行的输出内容是一个关系表达式,结果是一个布尔值,由于之前初始化了'0',与0是不相等的,所以结果为0。

第11行的输出内容是一个赋值表达式,结果是num的值0。

第12行的输出内容是一个关系表达式,结果是一个布尔值,由于num等于0。请注意赋值操作符“=”不是等于或者相等的意思,而是赋值的意思,区别于比较操作符“==”,这是很容易出错的地方。

2.5.浮点数的比较

这里有宏定义与const定义常量的例子:

前面说过,浮点数是存在精度上的误差的,所以在比较浮点数之间,存在一些偏差:

第14行中判断两个浮点数是否相等,有时候会得出错误结果。

一般都要采用第15行这样的方法比较两个浮点数是否相等。

2.6.自增/自减操作符

C语言还有一组自增操作符与自减操作符。

以下4个表达式,第3、4行等价,第5、6行等价。

第3行变量num有初始值,假设是1,对它+3将会得到4,一次这行语句之后num得到了新的值4。这是C语言里的常规操作,需要适应这种用法。

除此之外,其它的操作符也有类似的演变。

之所以有这样的演变是因为在没有预期的编译器优化情况下,自操作符的效率更高,CPU有专门的对应指令。当然现在编译器也变得更“聪明”,但是习惯上还是趋向后者的写法,日常实践中使用频次高了,自然也就习惯了。

本章节的信息量非常大,考虑到消化吸收的渐进过程,有一部分内容先忽略掉,安排到后文的综合讨论效果应该会更好一点。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容