4.1算数运算符
c语言提供的算数运算符:+、-、*、/、%、++、--(float、double不能取余)
运算符 | 功能说明 | 举例 |
+ | 加,一目取正 | a+b |
- | 减,一目取负 | a-b |
* | 乘法 | a*b |
/ | 除法 | a/b |
% | 取模或求余 | a%b |
++ | 加1 | a++,++a |
-- | 减1 | a--,--b |
#include<stdio.h>
int main()
{
float a=15, b=8, c;
c = a + b;
printf("c=%f \n",c);
c = a - b;
printf("c=%f \n",c);
c = a * b;
printf("c=%f \n",c);
c = a / b;
printf("c=%f \n",c);
return 0;
}
4.2关系运算符
关系表达式的值是“真”和“假”,用“1”和“0”表示,如:5>0的值为真,即为1
运算符 | 功能说明 | 举例 |
> | 大于 | a>b |
>= | 大于等于 | a>=2 |
< | 小于 | a<b |
<= | 小于等于 | a<=2 |
== | 等于 | a==b |
!= | 不等于 | a!=b |
4.3逻辑运算符
运算符 | 功能说明 | 举例 |
! | 逻辑反 | !(x==0) |
&& | 逻辑与 | x>0 && x<10 |
|| | 逻辑或 | y<10 || x>5 |
逻辑运算符"!"运算符的运算规律:
运算量 | 结果 |
1 | 0 |
0 | 1 |
例如:
#include<stdio.h>
int main()
{
int a =8,b =9;
if(!((a-1)>=b))
printf("ture \n");
else
printf("fause \n");
return 0;
}
由于逻辑运算符"!"的作用所以运行结果是"ture"
逻辑与"&&"运算符的运算规律如下:短路特性-逢0截止
左运算量 | 右运算量 | 结果 |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
例如:
#include<stdio.h>
int main()
{
int a =8,b =9;
if((a+1)>=b && b++ )
printf("ture \n");
else
printf("fause \n");
return 0;
}
逻辑或"||"运算符的运算规律如下:短路-逢1截止
左运算量 | 右运算量 | 结果 |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
例如:
#include<stdio.h>
int main()
{
int a =8,b =9;
if((a-1)>=b || b++ )
printf("ture \n");
else
printf("fause \n");
printf("%d %d \n",a,b);
return 0;
}
4.4位运算
运算符 | 功能说明 | 举例 |
~ | 位逻辑反 | ~a |
& | 位逻辑与 | a&b |
| | 位逻辑或 | a|b |
^ | 位逻辑异或 | a^b |
>> | 右移动 | a>>1 |
<< | 左移动 | a<<1 |
位逻辑反"~"运算符运算举例:
#include<stdio.h>
int main()
{
unsigned char x = 0x17,y;
y = ~x;
printf("%#x \n",y);
return 0;
}
运行结果为0xe8
位逻辑与"&"运算符运算规律如下:
左运算的位值 | 右运算的位值 | 位与结果值 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
举例:
#include<stdio.h>
int main()
{
unsigned char x = 0126,y = 0xac,z;
z = x&y;
printf("%#x \n",z);
return 0;
}
运行结果为0x4
位逻辑或"|"运算符的运算规律如下:
左运算量的位值 | 右运算量的位值 | 位或结果值 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
举例:
#include<stdio.h>
int main()
{
unsigned char x = 076,y = 0x89,z;
z = x|y;
printf("%#x \n",z);
return 0;
}
运行结果为oxbf
逻辑异或"^"运算符运算规律如下:相同为假,不同为真
左运算的位值 | 右运算的位值 | 位异或结果值 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
举例:
#include<stdio.h>
int main()
{
unsigned char x = 076,y = 0x89,z;
z = x^y;
printf("%#x \n",z);
return 0;
}
运行结果为0xb7
位运算的一般形式:
<运算量><运算符><表达式>其中:
·<运算量>必须为整形结果数值;
·<运算符>为左移(<<)或右移(>>)运算符;
·<表达式>也必须为整形结果数值
例如:
#include<stdio.h>
int main()
{
unsigned char x = 0xe4,z;
z = x<<3;
printf("%#x \n",z);
return 0;
}
运行结果为0x20
4.5赋值运算符
运算符 | 功能说明 |
+= | 加赋值复合运算符 |
-= | 减赋值复合运算符 |
*= | 乘法赋值复合运算符 |
/= | 除法赋值复合运算符 |
%= | 求余赋值复合运算符 |
&= | 位与赋值复合运算符 |
|= | 位或赋值复合运算符 |
^= | 位异赋值复合运算符 |
>>= | 位右移赋值复合运算符 |
<<= | 位左移赋值复合运算符 |
举例:
#include<stdio.h>
int main()
{
int count = 0, sum = 0;
while(count++<100)
{
sum += count;
}
printf("sum = %d \n",sum);
return 0;
}
上面代码计算了从1加到100的数值运行结果为5050
4.6特殊运算符
4.6.1条件运算符
"?"是三目运算符,其运算的一般形式是:
<表达式1>?<表达式2>:<表达式3>
例如:
#include<stdio.h>
int main()
{
int x = 70,y = 25;
y = x++ > 70 ? 100 : 0;
printf("x = %d y = %d \n",x,y);
return 0;
}
运行结果为x = 71,y = 0
4.6.2逗号运算符
#include<stdio.h>
int main()
{
float x = 0.5,y = 0.8,z = 0;
z = (x+=5,y = x+0.8,z = x+y);
printf("x = %f y = %f z = %f \n",x,y,z);
return 0;
}
逗号运算符的运算结果由最后一个表达式决定
4.6.3sizeof运算符
运算符的一般形式:sizeof(类型或变量名)
注意:它只针对数据类型,而不针对变量
例如它可以看数据类型占用的字节大小:
#include<stdio.h>
#include<stdbool.h>
int main()
{
printf("%d %d %d %d \n",sizeof(bool),sizeof(char),sizeof(short),sizeof(int));
}
4.6.4c运算符的优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名 | 单目运算符 | ||
-- | 自减运算符 | --变量名 | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3 | / | 除 | 表达式 / 表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 表达式1? 表达式2: 表达式3 | 右到左 | ||
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 |
补充内容:
1.各类数值型数据之间的混合运算
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同的数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:
1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2.转换按数据长度增加的方向进行,以保证精度不降低。如int 型和long 型运算时,先把 int 量转成long 型后再进行运算。
3.所有的浮点型运算都是以双精度进行的,即使仅含有float单精度运算的表达式,也要先转换成double型,再作运算。
4.Char型和 short型参与运算时,必须先转换成int 型。
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分将四舍五入向前舍入。
2.强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符)(表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float)a 把a强制转换为实型(int )(x+y)把x+y的结果转换为整型在使用强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int )(x+y)写成(int)x+y 则表示把x 转换成int型之后再与y相加了。
2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
3.算术运算符和算术表达式
运算符的优先级:C语言中,运算符的运算优先级共分为15级,1级最高,15级最低。在表达式中,优先级较高的先于优先级教低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
运算符的结合性:
C语言中各运算符的结合性分为两种,即左结合性(自左向右)和右结合性(自右向左)。
例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则 y应先和“-”号结合,执行x-y 运算,然后再执行+z的运算。这种自左至右的结合方向称为“左结合性”。而自右向左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
4.自增,自减运算符
自增1,自减1运算:
自增1运算符为“++”,其功能是使变量的值自增1.
自减1运算符记为“--”,其功能是使变量值自减1.
自增1,自减1运算符均为单目运算符,都具有右结合性,有以下形式:
++i :i自增1后参与其他运算
--i : i自减1后在参与其他运算
i++ :i参与运算后,i的值再自增1
i- : i参与运算后,i的值再自减1
在理解和使用上容易出错的是i++ 和i--,特别是当他们同时出现在比较复杂的表达式或语句中时,常常难于弄清,因此需要仔细分析。