------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>