C Primer Plus 学习笔记 第5章 运算符、表达式和语句

暑假期间继续写博客。

全书共分17章,这是关于本书第5章内容的博客,本章主要介绍了运算符,还介绍了表达式和语句。博客的目录和书上目录是相似的。此系列博客的代码都在Visual Studio 2022环境下编译运行。

我目前大一刚刚结束,水平有限,博客中若有错误或者总结不到位的地方也请见谅。

目录

5.1 循环简介

5.2 基本运算符

5.2.1 赋值运算符:=

5.2.2 加法运算符:+

5.2.3 减法运算符:-

5.2.4 符号运算符:-和+

5.2.5 乘法运算符:*

5.2.6 除法运算符:/

5.2.7 运算符优先级

5.2.8 优先级和求值顺序

5.3 其他运算符

5.3.1 sizeof运算符和size_t类型

5.3.2 求模运算符:%

5.3.3 递增运算符:++

5.3.4 递减运算符:--

5.3.5 优先级

5.3.6 不要自作聪明

5.4 表达式和语句

5.4.1 表达式

5.4.2 语句

5.4.3 复合语句(块)

5.5 类型转换

5.6 带参数的函数


5.1 循环简介

花括号以及被花括号括起来的语句称为

while循环内容在第6章。

5.2 基本运算符

C语言用运算符表示算术运算。

5.2.1 赋值运算符:=

在C语言中,=不意味着相等,而意味着赋值。=左侧是一个变量名,右侧是赋给该变量的值,=被称为赋值运算符,将右侧值赋给左侧变量。不能给常量赋值。

赋值表达式的目的是把值存储到内存位置上。用于存储值的数据存储区域统称为数据对象。C语言是面向过程的,而C++和Java是面向对象的。

左值用于标识特定数据对象的名称和表达式。对象指的是实际的数据存储,左值是用于标识或定位存储位置的一个标签。可修改的对象被称为可修改的左值。赋值运算符的左侧应该是可修改的左值。

右值是能赋给可修改左值的量,本身不是左值。右值可以是常量,变量或表达式的值。当前经常称右值为表达式的值

运算符操作的对象是运算对象

C语言可以多重赋值,给用=连接的多个变量赋同一个值。

5.2.2 加法运算符:+

+表示加法,使两侧值相加。

5.2.3 减法运算符:-

-表示减法,使左侧的数减去右侧的数。

+和-被称为二元运算符,需要两个运算对象才能完成操作。

5.2.4 符号运算符:-和+

-也可以用于表明或改变一个值的代数符号,得到值的相反数,此时是一元运算符,一元运算符只需要一个操作对象。

+在作为一元运算符时,不改变对象的值或符号。

5.2.5 乘法运算符:*

*表示乘法,使两侧值相乘。

5.2.6 除法运算符:/

/表示除法,左侧的数是被除数,右侧的数是除数。

浮点数除法的结果是浮点数。整数除法的结果是整数,如果结果有小数,会丢弃小数部分,称为截断。整数和浮点数相除,整数会转化为浮点数,结果是浮点数。

C99规定截断是趋零截断,正数截断后是不大于该正数的最大整数,负数截断后是不小于该负数的最小整数。

5.2.7 运算符优先级

C语言有明确的规定,通过运算符优先级来解决操作顺序的问题。每个运算符都有自己的优先级

优先级高的运算先执行,两个运算符的优先性相同,则按照出现顺序执行。

大多数运算符是从左到右结合,一些运算符(如=)是从右到左结合。

圆括号括起来的内容最先执行,圆括号内按规则执行。

截至目前的优先级是:

() >+ -(一元) >* / >+ -(二元)> =

一元+ -和=是从右向左结合,其余是从左向右结合。

5.2.8 优先级和求值顺序

运算符优先级为表达式中的求值顺序提供重要的依据,但是并没有规定所有的求值顺序。

当运算符共享一个运算对象时,优先级决定了求值顺序。但是优先级并未规定同一运算符两侧的运算对象先算哪一个,C语言把主动权留给语言的实现者。

结合律只适用于共享同一运算对象的运算符。

5.3 其他运算符

5.3.1 sizeof运算符和size_t类型

sizeof运算符以字节为单位返回运算对象的大小。sizeof返回size_t类型的值,用%zd转换说明。

5.3.2 求模运算符:%

求模运算符只能用于整数运算,求左侧整数除以右侧整数的余数。

在a和b都是整数的情况下,可以通过a - (a / b) * b计算a % b的值。

5.3.3 递增运算符:++

递增运算将运算对象递增1。++可以出现在变量前面,是前缀模式。++也可以出现在变量后面,是后缀模式。两种模式的区别在于递增发生的时间不同。

使用++(还有后面--)可以让程序代码更紧凑,程序更简洁且可读性更高,生成的机器码效率更高。++和--在循环中很普遍。

前缀++在使用变量的值之前递增变量,后缀++在使用变量的值之后递增变量。

单独使用++使用前缀和后缀的效果相同,但是作为表达式的一部分时效果不同。

5.3.4 递减运算符:--

递减运算符与递增运算符的作用相反。前缀--在使用变量的值之前递减变量,后缀--在使用变量的值之后递减变量。

>表示大于,<表示小于,这两个运算符属于关系运算符

5.3.5 优先级

递增运算符和递减运算符都有很高的优先级,只有圆括号的优先级比它们更高。

5.3.6 不要自作聪明

在C语言中,编译器可以自行选择先对函数中的哪个参数求值,可以提高编译器效率。

如果一个变量出现在一个函数的多个参数中,不要对此变量使用递增或递减运算符。

如果一个变量多次出现在一个表达式中,不要对此变量使用递增或递减运算符。

5.4 表达式和语句

C语言基本步骤由语句组成,大多数语句由表达式构成。

5.4.1 表达式

表达式由运算符和运算对象组成。

最简单的表达式是一个单独的运算对象。运算对象可以是常量,变量或二者的组合。每个表达式都有一个值。赋值表达式的值就是赋值运算符左侧变量的值。关系表达式的值是0或1(真为1,假为0)。

5.4.2 语句

语句是C程序的基本构建块。C语言中大部分语句以分号结尾。

只有一个分号的语句是空语句,空语句什么也不做。

C语言中的副作用是对数据对象或文件的修改。

序列点是程序执行的点,在该点上,所有副作用都在进入下一步之前发生。分号就是一个序列点。一个完整表达式的结束也是一个序列点。完整表达式指这个表达式不是另一个更大表达式的子表达式。

5.4.3 复合语句(块)

复合语句是指用花括号括起来的一条或多条语句,又称为

使用缩进可以为读者指明程序的结构。

5.5 类型转换

在语句和表达式中应使用相同类型的变量和常量。如果使用混合类型,C语言会按一定的规则进行自动类型转换,虽然便利,但可能产生意外结果。

当进行类型转换时,无论是unsigned还是signed的char和short都会自动转换成int(有必要的话转换成unsigned int)。较小类型转换为较大类型是升级

涉及两种类型的运算,两个值被分别转换为两种类型的更高级别。

类型的级别从高到低依次为long double,double,float,unsigned long long,long long,unsigned long,long,unsigned int,int。当long和int类型大小相同时,unsigned int比long级别高。

在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。可能导致类型升级或降级。降级是把较大类型转换成较小类型。降级会导致忽略额外的位。

作为函数参数传递时,char和short被转换成int,float被转换成double。函数原型会覆盖自动升级。

通常要避免自动类型转换,尤其是类型降级。

有时需要进行精确的类型转换,或者表明类型转换的意图,需要强制类型转换。强制类型转换就是在量前面放置用圆括号括起来的类型名,程序会将其转换为被括起来的目标类型名。

5.6 带参数的函数

函数原型的格式是:返回值类型 函数名称(参数表)

如果函数不接受任何参数,则在函数头的圆括号中写上void。如果函数接受参数,则在圆括号中声明,参数名遵循C语言命名规则。

声明参数创建了形式参数,函数调用时传递的值是实际参数。形式参数是变量,实际参数是提供的值(可以是常量,变量,表达式的值),实际参数被赋值给对应形式参数。

变量名是函数私有的,在函数中定义的变量名不会和别处的同名变量冲突。

第9章会深入介绍函数。

你可能感兴趣的:(C,Primer,Plus学习笔记,学习,c语言)