C语言学习之关于运算符和表达式

目录

    1.初步认识运算符和表达式

2.运算符和表达式——算式

(1).关于除法运算

(2).关于求余运算

3.运算符和表达式——关系

4.运算符和表达式——逻辑

5.运算符和表达式——位

(1).按位与:按位与"&"运算符,将两个运算量对应的二进制逐一按位进行逻辑与运算。每一位二进制数都要参与运算,包括符号位。

(2).按位或:按位或"|"运算符,将两个运算量对应的二进制逐一按位进行逻辑或运算。每一位二进制数都要参与运算,包括符号位。

(3).按位异或:按位异或"^"运算符,将两个运算量对应的二进制逐一按位进行逻辑异或运算。每一位二进制数都要参与运算,包括符号位。异或运算的规则为:相异为真,相同为假。

(4).按位取反:按位取反"~"运算符是一元运算符,其结果是将运算量的每个二进制位逐一取反。每一位二进制数都要参与运算,包括符号位。

(5).左移:左移"<<"运算符是一个二元运算符,需要两个运算量参与,且两个都必须是整数。例如a<,其意义是将a按照二进制向左移动n位,变量a二进制的最高位n位舍弃,最低的n位用0补齐。<>

(6).右移:右移">>"运算符与左移运算符类似,都是二元运算符,目的是将运算量的二进制数右移。右移一位时,最低位舍弃。最高位补齐的数值需要根据运算量的类型决定。如果运算量是一个有符号整数则补其符号位,如果是无符号的整数则最高位补0。 

6.运算符和表达式——自增自减

 7.运算符和表达式——赋值

8.运算符和表达式——逗号

9.运算符和表达式——条件

10.运算符和表达式——求字节数

11.运算符和表达式——类型转换

12.代码练习(完善解决找零问题的代码)


    1.初步认识运算符和表达式

运算符:就是表示某种运算功能的符号。按照操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、按位运算符以及其他运算符如赋值运算符、条件运算符、逗号运算符等等。

如果对运算符所需要涉及的操作数的个数对运算符进行分类,可分为以下三种:

*单目运算符  取负运算符(-)

*双目运算符  算数运算符(+)

*三目运算符  条件运算符(?:)

表达式:是由操作数和运算符组成的序列,它和算术中的四则混合运算类似,其中操作数可以是常量,也可以是变量。

优先级:各类运算符在一个表达式中运算的先后顺序。如表达式9+5*8中,先进行乘法运算再进行加法运算。

结合性:当一个运算符两侧的运算符优先级相同时运算的结合方向。如9+4-6中,其加减的结合性是自左向右,因此先做加法再做减法。

优先级和结合性的规律

结合性:除单目运算符、赋值运算符和条件运算符右结合性外,其他都是左结合性

优先级:”单目高于双目,双目高于三目,三目高于赋值“。

其中双目运算中的10个优先级的先后顺序可记忆为:”算数运算符高于移位运算符,移位运算符高于关系运算符,关系运算符高于位逻辑运算符(不包括单目位逻辑运算符),位逻辑运算符高于逻辑运算符“

表达式求值的步奏:(1).先按运算符的优先级高低次序执行。

                                (2).如果再一个操作数两侧的运算符的优先级相同,则按照C语言规定的结合方向(结合性)进行。

2.运算符和表达式——算式

算术表达式:使用算术运算符和括号将运算量链接起来的式子。

例如:

乘法运算符(*)——a*b 结果为a和b的乘积

除法运算符(/)——a/b 结果为a除以b的

求余运算符(%)——a%b 结果为a除以b的余数

加法运算符(+)——a+b 结果为a和b的

减法运算符(-)——a-b 结果为a和b的

注:%运算符要求参加运算的运算对象(操作数)为整数,结果也为整数;

      两个实数相除的结果是双精度实数,两个整数相除的结果为整数。

(1).关于除法运算

1/2=0,而1.0/2 =0.5  (注:类型不同的数进行运算,其结果按类型优先级高的类型定义。

类型优先级高低:float

(2).关于求余运算

求余计算结果的符号与前一操作数的符号相同

3.运算符和表达式——关系

关系表达式:用关系运算符链接的两个表达式构成。关系运算符实际上就是比较运算符

运算符"<"(小于)eg:3<5;结果为1

运算符">"(大于)eg:3>5; 结果为0

运算符"<="(小于等于)eg:3<=5;结果为1

运算符">="(大于等于)eg:3>=5;结果为0

运算符"=="(等于)eg:3==5;结果为0

运算符”!="(不等于)eg:3!=5;结果为1

综上,当结果成立时,结果为1;当结果不成立时,结果为0;而且参与关系运算的两个运算量可以是任意类型的数据。

优先级:(<,<=,>=,>)高于(==,!=)

结合性:自左向右

*算数运算符的优先级高于关系运算符

4.运算符和表达式——逻辑

逻辑表达式:用逻辑运算符连接两个表达式构成。参与逻辑运算的操作数叫逻辑量。逻辑量可以是整型、实型、字符型和指针类型等多种类型。

运算符"!"(非)eg:!3;结果为0

运算符"&&"(与)eg:3&&0;结果为0

运算符"||"(或)eg:3||0;结果为1

综上,C语言中,逻辑运算结果用数值1表示真,用数字0表示假。在逻辑运算中,非零的数当作真,0当作假,因此任何类型的数据都可以参与到逻辑运算当中。

优先级:!>&&>||
结合性:自左向右

注:在一个&&表达式中,如果&&的左侧为假,那么C语言不会再判断右侧。同理,在一个||表达式中,如果||左侧为真,那么C语言不会再判断右侧的真假

5.运算符和表达式——位

位运算:整型数据进行的运算,而且符号位需要参与运算。位运算主要用于编写系统软件,完成汇编语言能够完成的一些功能。

运算符"&"(按位与)eg:3&5;结果为1

运算符"|"(按位或)eg:3|5;结果为7

运算符"^"(按位异或)eg:3^5;结果为6

运算符"~"(按位取反)eg:~3;结果为-4

运算符"<<"(左移)eg:3<<1;结果为6

运算符">>"(右移)eg:3>>1;结果为1

*分析位运算结果时,先将运算的整数转换位二进制再进行换位运算。

(1).按位与:按位与"&"运算符,将两个运算量对应的二进制逐一按位进行逻辑与运算。每一位二进制数都要参与运算,包括符号位。

(2).按位或:按位或"|"运算符,将两个运算量对应的二进制逐一按位进行逻辑或运算。每一位二进制数都要参与运算,包括符号位。

(3).按位异或:按位异或"^"运算符,将两个运算量对应的二进制逐一按位进行逻辑异或运算。每一位二进制数都要参与运算,包括符号位。异或运算的规则为:相异为真,相同为假。

(4).按位取反:按位取反"~"运算符是一元运算符,其结果是将运算量的每个二进制位逐一取反。每一位二进制数都要参与运算,包括符号位。

(5).左移:左移"<<"运算符是一个二元运算符,需要两个运算量参与,且两个都必须是整数。例如a<其意义是将a按照二进制向左移动n位,变量a二进制的最高位n位舍弃,最低的n位用0补齐。

(6).右移:右移">>"运算符与左移运算符类似,都是二元运算符,目的是将运算量的二进制数右移。右移一位时,最低位舍弃。最高位补齐的数值需要根据运算量的类型决定。如果运算量是一个有符号整数则补其符号位,如果是无符号的整数则最高位补0。 

6.运算符和表达式——自增自减

运算符"++i,--i"  在使用i之前,先使i的值加1/减1,即先增减,再运算

运算符"i++,i--"  在使用i之后,使i的值加1/减1,即先运算,再增减

++i是先执行i=i+1,再使用i的值;而i++是先使用i的值,再执行i=i+1 

结合性:自右向左

注意:(1).自增、自减运算常用在循环语句中,使循环变量加/减1;以及指针变量中,使指针指向下/上一个地址。

(2).自增、自减运算符,不能用于常量和表达式。 

 7.运算符和表达式——赋值

赋值运算符:"=",赋值表达式是由赋值运算符连接左边一个变量和右边一个表达式构成。(即[变量]=[表达式])

优先级:!>算数>关系>&&和||>赋值

结合性:自右向左

注意:格式左边一定是一个变量,格式右边可以是任意的表达式。表达式计算结果的数据类型应当和变量的类型相同。

复合赋值运算符:由赋值运算符之前再加一个双目运算符构成的。

复合赋值运算符的一般格式为:表达式1 op=表达式2   eg:a+=b-1

它等价于:表达式1=表达式1 op(表达式2)  eg:a=a+(b-1)

优先级:与”=“是同一优先级。

结合性:自右向左 

8.运算符和表达式——逗号

逗号运算符:","  ,作用:将几个表达式隔开并以此计算。

格式:[表达式1]、[表达式2]、……[表达式n]

优先级:最低

结合性:自左向右

整个表达式的值=最后一个表达式的值

求解方法:自左向右,依次计算各表达式的值,最后一个表达式的值即为整个逗号表达式的值。

9.运算符和表达式——条件

条件运算符:"?:"  作用:判断一个逻辑表达式的结果,如果为真则指定执行某个表达式,如果为假则指定执行另外的表达式。条件表达式的实质就是起程序控制作用。

格式:表达式1?表达式2:表达式3

求值规则:先求解表达式1的值,若为真(非0),则求解表达式2并把表达式2的值作为整个条件表达式的值;若表达式的值为假(0),则求解表达式3并把表达式3的值作为整个条件表达式的值。

优先级:逻辑>条件>赋值

结合性:自右向左 

10.运算符和表达式——求字节数

sizeof()运算符是一个单目运算符,用于计算一个某种类型的运算量所占用的字节数。

使用形式:(1).sizeof(类型标识);

                  (2).sizeof(变量名)    或   sizeof 变量名

11.运算符和表达式——类型转换

类型转换分为两种:自动类型转换、强制类型转换

其中,自动类型转换指的是:在运行时不需要用户干预,系统自动进行的类型转换。

而强制类型转换指的是:当自动类型转换不能实现目的时,可以用强制类型转换。

自动类型转换又可以分为:赋值转换和运算转换

(1).赋值转换的五个要求:

*浮点型赋值给整型,结果将舍弃浮点数的小数部分

*整数赋值给浮点数,数值不会发生变化,结果以浮点数的方式存在。

*字符型赋值给整型,数值不会发生变化,但以整型的方式存储,内存空间变大

*整型赋值给字符型,只把整型变量低8位赋值给字符型变量。

*双精度浮点数赋值给单精度浮点数,有效位会减少,丢失的部分四舍五入

(2).运算转换

C语言允许整型、实型、字符型数据进行混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后再进行运算。转换的过程是C语言编译器自动进行的。

*转换按数据占用字节数增加的方向转换,例如int类型和short类型的变量进行计算时,会把short类型转换成int类型之后再进行计算。

*浮点数运算都是按照双精度进行的,float类型的变量会先转换成double类型再进行计算。(转换特点:由数值存储位少的向多的转换

强制类型转换:是由程序员通过类型说明符实现的,通过强制类型转换可以将一种类型的变量强制转变为另一种类型。

格式:(类型说明符)[表达式]

*类型说明符和表达式都必须加括号,如果表达式是单个变量则可以不加

*无论是强制类型转换还是自动类型转换,都不改变其原变量的数据类型。即对一个变量进行强制类型转换后得到的一个新类型的数据,原来的变量类型是不变的。

12.代码练习(完善解决找零问题的代码)

#include
int main()
{
float a,b,c;
printf("请输入您购买商品的总金额(元):");
scanf("%f",&a);

printf("收您(元):");
scanf("%f",&b);

c=b-a;
printf("找您(元):%f\n",c)

return 0;
}

该程序使用float定义变量a,b,c;解决了上次只能输入整数的问题且完善了整体需输入的购买金额和收取金额,增加了其可使用性

你可能感兴趣的:(学习)