黑马程序员——C语言基础---运算符

时间:2023-02-19 13:37:49

                                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

一、运算符的分类

按照功能划分:

算术运算符、关系运算符与逻辑运算符、按位运算符

运算符根据参与运算的操作数的个数分为:

单目运算

只有一个操作数 如 : i++ ! sizeof

双目运算

有两个操作数 如 : a+b

三目预算

C语言中唯一的一个,也称为问号表达式 a>b ? 1 : 0

二、算术运算符介绍及用法

1、算术运算符包括:

名称

符号

说明

加法运算符

+

双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有左结合性。

减法运算符

-

双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合 性。

乘法运算符

*

双目运算符,具有左结合性。

除法运算符

/

双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如
果运算量中有一个是实型,则结果为双精度实型。

求余运算符 (模运算符)

%

双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double 类型。 求余运算的结果等于两数相除后的余数,整除时结果为0。

特点:
什么样数据类型相互运算结果还是什么数据类型

2、算术运算符的结合性和优先级

结合性:从左到右

优先级:

(1) * / % 优先级 大于 + -

(2) 优先级相同则左结合计算 3*5/3+18 ----> 先算3*5

<span style="font-family:SimSun;"><span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
//表示定义了三个整型的变量
int a = 10,b=3,result=0;
//f1 是float类型,单精度
float f1 = 3.0f;
result = a+b; //13
result = a-b; //7
result = a*b; //30
//a、b都是整型,除法的时候,两个操作数如果都是整型的,结果也是整型的
result = a/b; //3
printf("%f\n",a/f1); //3.333333
//result是一个int类型的数,如果给他赋值一个小数,那么此时只能保存小数的整数部分
result = a/f1; //3
//1-1.5按理说应该是-0.5 放到整型变量result中,只保留整数部分
//所以是0 ,0是部分正负
result = 1-1.5;//-0.5 -0 0
result = ((a*b)/3)-(5*6)+30;
// a*b = 30
// 30/3 = 10
// 5*6=30
// (10-30)+30
// -20
// 10
printf("result = %d\n",result);
return 0;
}</span></span>

三、求余运算符使用注意

1、求余的规则

       int m = 10,n = 3;

       m%n   m除以n之后,取得余数部分

       10%3 == 1   

       m = 0  可以的,0

       n = 0  不可以的,无意义

       m > n  正常求余数就可以  1

       m < n  结果 m

2、求余的注意事项

       1)m和 n都不能为小数

       2)m < 0  结果为负数

       3)n < 0  正负性取决于m

<span style="font-family:SimSun;">#include <stdio.h>
int main(int argc, const char * argv[]) {
//写法规范:运算符的两侧我们一般加上一个空格
int result = 10 % 3; //1
result = 23 % 2; //1 (奇数)
result = 20 % 2; //0 (偶数)
result = 3 % 10;
// result = 3.5 % 10; //不对的,求余的双方不能为小数
result = -3 % 10;
result = 3 % -10;
printf("result = %d\n",result);
return 0;
}</span>

四、 算术运算符中的类型转换问题

算术运算符中的类型转换可分为:

    1)隐式转换(自动转换)

     2)显示转换(强制类型转换)

<span style="font-family:SimSun;"><span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
float f1 = 23.4f;
int num = 10;
//1、隐式类型转换
// f1 + num
// float + int 这是可以运行的
// int --> 会自动的转换为 float类型,隐式转换
// float + float
int sum = f1+num;
//f2 33.4 验证了,我们刚说的,int 转换为float类型了
float f2 = f1 + num;
printf("%d\n",sum); //33.4 33
printf("%f\n",f2); //33.400000
//2、显示类型转换 (强制类型转换)
//强制类型转换的格式: (要转换的类型)要转换的变量或者表达式;
printf("%d\n",(int)(f1+num));
// int + int
int sum2 = (int)f1 + num;
printf("sum2 = %d\n",(int)f1 + num);
//23.4 ----> 23 只取了整数部分
printf("f1 = %d\n",(int)f1);
//注意事项:
//1、用一个大数加上一个特别小的数,如果使用float会有问题(造成数据丢失)
// float的有效数位只有 7 位
int num3 = 3455;
float f3 = 0.00003;
printf("%f\n",num3+f3); //3455.00003
//2、强制类型转换是临时转换
printf("f1 d= %d\n",(int)f1); //23 此处是临时转换,不会改变原值
printf("f1 f= %f\n",f1); // 23.400000
return 0;
}</span></span>

五、表达式

   1、表达式:用运算符把常量、变量、函数按照一定的规则,连接起来的式子,就称之为表达式

   2、表达式分类:算术表达式  关系表达式   逻辑表达式

      重点:表达式一定有返回值

   3、表达式语句:表达式后面加上分号,构成表达式语句

   int a = 10,b = 3;

   int c = a+b;   // a+b 返回值 13

       c = 1+1;

       c = a+4;

六、赋值运算符

1、赋值运算符

        = 

      作用:  把等号右侧的值给等号左侧的变量

        100 = 3;  //不对的   a+b = 3;  //不对

      注意: 等号的左侧必须是一个变量

2、赋值语句

在赋值表达式后面添加一个分号,构成了一个语句,称为赋值语句。

例如:式子x=(a=5)+(b=8)是合法的。

它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其未尾加上分号就构成为语句。 因此如x=8;a=b=c=5;都是赋值语句

3、复合的赋值运算符

在赋值符“=”之前加上其它二目运算符可构成复合赋值符。

/=

除后赋值 变量/=表达式

如:a/=3;即a=a/3

*=

乘后赋值 变量*=表达式

如:a*=3;即a=a*3

%=

取余后赋值 变量%=表达式

如:a%=3;即a=a%3

+=

加后赋值 变量+=表达式

如:a+=3;即a=a+3

-=

减后赋值 变量-=表达式

如:a-=3;即a=a-3

构成复合赋值表达式的一般形式为:变量双目运算符=表达式

它等效于

变量=变量双目运算符 表达式

例如:

a+=5等价于 a=a+5 x*=y+7 等价于 x=x*(y+7) r%=p 等价于 r=r%p

注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。 

<span style="font-family:SimSun;"><span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 3,b=4,result=0;
// 1、赋值运算符的优先级
// = + -
// 7 - 3
// = -
// = 4
result = a+b-3;
printf("result = %d\n",result);
//2、赋值运算符的结合性
// 赋值运算符 结合型:右结合(自右向左)
int a1,b1,c1;
a1 = b1 = c1 = 10;
// 3 2 1
//(a1 = (b1 = (c1 = 10)));
printf("a1 = %d,b1 = %d,c1 = %d\n",a1,b1,c1);
//疑惑?
//int a2 = b2 =c2 =10;
return 0;
}</span></span>

七、自增、自减运算符

1、运算符介绍

在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作提供了两个更为简洁的运算符,++和--,分别叫做自增运算符和自减运算符。它们是单目运算 符,是从右向左结合的算术运算符。

2、自增、自减运算符求值过程

1)前缀表达式:++x, --x; 其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

2)后缀表达式:x++, x--; 先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

3)自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。

如:++(a+b),与5++, const int N=0; N++; 等都是错误 的。

而i+++j++、++i+(++j)、++a+b++、++array[--j]等,这些都是合法的

3、运算符优先级和结合性

优先级

优先级是第2级

右结合

编译器对程序编译时,从右到左可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作用的对象都是变量,这是合法的;

注意:不管“++” 在前还是在后,最后变量的值都会+1 

八、sizeof运算符

sizeof运算符是一个单目运算符

   作用是:计算常量、变量、数据类型 在内存中占用的字节数

   1)用sizeof计算常量在内存中占用的字节数

      sizeof(1)   //计算常量 1 在内存中占用的字节数   4

                  //  1 默认的事一个10进制的整数(int) 4

      sizeof(2.3f); //计算 float类型的常量在内存中占用的字节数 4

      sizeof(2.3);  //计算 double 类型的常量在内存中占用的字节数 8

      sizeof('a');  //计算 'a' 字符常量 在内存中占用的字节数  1  4?

   2)用sizeof运算符计算变量在内存中占用的字节数

      int a = 10;

      float f1 = 2.3f;

      double d1 = 2.3;

      char ch = 'a';

      sizeof(a);   //计算int类型变量a在内存中占用的字节数 //4

      sizeof(f1);  //计算float类型的变量 f1 占用的字节数 //4

      sizeof(d1);  //计算double类型的变量 d1 占用的字节数//8

      sizeof(ch);  //计算char类型的变量 ch 占用的字节数  //1

   3)sizeof用于计算某一种数据类型在内存中占用的字节数

      sizeof(int);    //表示int类型的数据在内存中占用的字节数 4

      sizeof(float);  //表示float类型的数据在内存中占用的字节数4

      sizeof(double); //表示double类型的数据在内存中占用的字节数8

      sizeof(char);   //表示char类型的数据在内存中占用的字节数1

九、逗号运算符

1、基本概念

在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。

其一般形式为: 表达式1, 表达式2

2、求值过程

其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。

如果逗号表达式如下:

表达式1, 表达式2, ...表达式n整个逗号表达式的值等于表达式n的值。

3、逗号运算符使用注意:

1)逗号表达式一般形式中的表达式1和表达式2也可以又是逗号表达式。

例如: 表达式1, ( 表达式2, 表达式3 )形成了嵌套情形。

2)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

3)并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。

<span style="font-family:SimSun;"><span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 4,b = 5,result=0;
//a+4,b+3,a+b 用逗号连接的表达式是一个逗号表达式
//逗号表达式的求值过程:先逐个求表达式的值就,然后把最后一个表达式的值返回(作为整个逗号表达式的值)
// 8 , 8 , 9
result = (a+4,b+3,a+b,1+2,10);
printf("result = %d\n",result);
return 0;
}</span></span>

十、关系运算符

1、C语言中的真假性

在C语言中所有数值都是有真假性,非零即真,只有0为假,关系运算符返回值只有两个要么是真(1)要么是假(0) 关系运算符(比较运算符)

2、关系运算符

在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。

比较两个量的运算符称为关系运算符。

序号

运算符

 

结合性

1

>

大于 如:a>b a>3 5>4 1>2

左结合

2

<

小于 如:a<c d<3 2<5

左结合

3

>=

大于等于 如: a>=1 d>=c

左结合

4

<=

小于等于 如: a<=0 i<=19

左结合

5

==

等于 i==3 a==b

左结合

6

!=

不等于 a!=b c!=5

左结合

3、关系运算符的优先级

关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=

==和!=的优先级相同。 

<span style="font-family:SimSun;"><span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 3,b = 2,result = -1;
//把a>b的值赋值给result
// 3 2
result = a > b; //1
result = a < b; //0
// 判断 a 是不是大于或者等于 3
result = a >= 3; //1
result = a <= 3; //1
result = a == 3; //1
result = a == b; //0
result = a != b; //1
printf("result = %d\n",result);
return 0;
}</span></span>