文章目录
Linux-C P3 运算符和表达式
什么是运算符?什么又是表达式呢?
在学习如何使用之前先来了解一下它们的概念
运算符:进行运算的符号
表达式:用运算符和括号将操作数连接起来组成的表达式
算术运算符和表达式
算术运算符
算术运算符包括双目的加减乘除四则运算符和求模运算符,以及单目的正负运算符
先来看看加减乘除
加减乘除
从思维导图和名字基本上就已经知道加减乘除的功能
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b = 15,c;
c = a + b;//加法运算
printf("a + b = %d\n",c);
c = b - a;//减法运算
printf("b - a = %d\n",c);
c = a * b;//乘法运算
printf("a * b = %d\n",c);
c = b / a;//除法运算
printf("b / a = %d\n",c);
return 0;
}
这里就行进了变量的加减乘除的基本运算功能,下面来看看取模运算
取模运算
什么是取模运算呢?
就是求余数,取模运算的两个操作数只能是整数,不能是浮点数
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 22,b = 5,c;
c = a % b;
printf("a %% b = %d\n",c);
return 0;
}
这里的结果就是22/5 = 4 …2里面的余数2,好的下面到了自增和字减
自增和字减
除了这些算术运算符外,还有比较的特殊的自增运算符“++”和自减运算符“- -”
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 5,j = 5,k = 5,l = 5;
printf("i = %d j = %d k = %d l = %d\n",i,j,k,l);
printf("i++ = %d\n",i++);
printf("j-- = %d\n",j--);
printf("++k = %d\n",++k);
printf("--l = %d\n",--l);
printf("i = %d j = %d k = %d l = %d\n",i,j,k,l);
return 0;
}
这里“++”和“–”可以放在操作数前面或者后面,实现的功能会不一样
从输出的结果可以看出,同样是++,放在后面在执行完程序之后i才会自加1,而放在前面会直接增加,自减也是一样
算术表达式
用算术运算符和括号可以将操作数连接起来组成算术表达式
普通运算
就是简单的算术运算
c = a + b;
复合运算
算术表达式中,允许不同的算术符以及不同类型的数据同时出现
b = 18 / 3 * (2.5 + 8) - 'a';
类型转换
不同类型的数值数据在进行混合运算时,要先转换成同一类型之后再运算
自动类型转换:自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类型的转换,这种转换是系统自动进行的,下图为自动类型转换规则
强制类型装换:利用强制类型转换运算符可以将一个表达式的运算结果转换成所需要的类型
(类型名)表达式
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
float a=1.23;
printf("a = %f (int)a = %d\n",a,(int)a);
return 0;
}
关系运算符和表达式
关系运算符
在程序中经常需要通过比较两个值的大小关系来决定程序下一步的工作,比较两个值的运算符称为关系运算符
先来简单了解一下关系运算符
a > b //大于
a >= b // 大于等于
a < b //小于
a <= b //小于等于
a == b //等于
a != b //不等于
运算符 | 功能说明 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
关系表达式
关系运算符将两个表达式连接起来的表达式,称为关系表达式
关系表达式一般形式
表达式 关系运算符 表达式
当关系表达式的结果为真时输出1,为假输出0
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b =6,r;
r = (a > b);
printf("r = %d\n",r);
r = (a >= b);
printf("r = %d\n",r);
r = (a < b);
printf("r = %d\n",r);
r = (a <= b);
printf("r = %d\n",r);
r = (a == b);
printf("r = %d\n",r);
r = (a != b);
printf("r = %d\n",r);
return 0;
}
逻辑运算符和表达式
基本的3种逻辑运算符:与运算符(&&)、或运算符(||)和非运算符(!)
其中与运算符和或运算符均为双目运算符,具有左结合性
非运算符为单目运算符,具有右结合性
逻辑运算符
逻辑与(&&)
双目运算符,只有两个运算量都是1时,运算结果才为1
左运算量 | 右运算量 | &&运算结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b = 10,r;
r = (a != 5) && (b != 10);
printf("r = %d\n",r);
r = (a != 5) && (b == 10);
printf("r = %d\n",r);
r = (a == 5) && (b != 10);
printf("r = %d\n",r);
r = (a == 5) && (b == 10);
printf("r = %d\n",r);
return 0;
}
逻辑或(||)
当两个运算量进行或运算时,只是有一个运算量"1",结果就为"1"
左运算量 | 右运算量 | 或运算结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b = 10,r;
r = (a != 5) || (b != 10);
printf("r = %d\n",r);
r = (a != 5) || (b == 10);
printf("r = %d\n",r);
r = (a == 5) || (b != 10);
printf("r = %d\n",r);
r = (a == 5) || (b == 10);
printf("r = %d\n",r);
return 0;
}
非运算(!)
单面运算符,当运算量进行非运算,结果会取反
运算量 | !运算结果 |
---|---|
0 | 1 |
1 | 0 |
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,r;
r = !(a != 5);
printf("r = %d\n",r);
r = !(a == 5);
printf("r = %d\n",r);
return 0;
}
逻辑表达式
逻辑表达式的一般形式
表达式 逻辑运算符 表达式
其中的表达式也可是逻辑表达式,从而组成了嵌套的情形
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 1,b = 0,r;
r = (a || b) && (!b);
printf("r = %d\n",r);
return 0;
}
位运算符和表达式
位运算符是指进行二进制位的运算
位运算符
与运算符(&)
双目操作符,当两个位进行相与时,只有两者都为"1"时结果才为"1"
左运算量 | 右运算量 | &运算结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
或运算符(|)
双目操作符,当两个位进行相或时,两者中只要有一方为"1",结果就为"1"
左运算量 | 右运算量 | 或运算结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
异或运算符(^)
当两个位进行异或时,只要两者相同,结果就为“0”,否则结果为“1”
左运算量 | 右运算量 | ^运算结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
取反运算符(~)
单面运算符,当运算量进行取反运算,结果会取反
运算量 | !运算结果 |
---|---|
0 | 1 |
1 | 0 |
移位操作符(<< >>)
移位操作就是把一个数值左移或右移若干位
位表达式
普通位表达式
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0x55,b = 0x11,c;
c = a & b;
printf("%x\n",c);
c = a | b;
printf("%x\n",c);
c = a ^ b;
printf("%x\n",c);
c = ~a;
printf("%x\n",c);
c = a << 1;
printf("%x\n",c);
c = a >> 2;
printf("%x\n",c);
return 0;
}
运算执行时间
在移位操作中,左移n位相当于将原数乘以2的n次方,而右移n位则相当于将原数据除以2的n次方。这样的执行效率会比自己进行除法要快很多
操作 | 执行时间 |
---|---|
整数加法 | 1 |
整数乘法 | 4 |
整数除法 | 36 |
浮点加法 | 3 |
浮点乘法 | 5 |
浮点除法 | 38 |
移位 | 1 |
因此有时候利用位操作会比乘除要好要快
赋值运算符和表达式
赋值运算符
单纯赋值运算符
“=”它是个双目运算符,结合性是从左向右,其作用是将赋值号“=”右边的操作数赋给左边的操作数
x = 5;
复合赋值运算符
在赋值符“=”之前加上其他运算符,即构成复合的运算符
运算符 | 功能说明 |
---|---|
+= | 加赋值复合运算符 |
-= | 减赋值复合运算符 |
*= | 乘法赋值复合运算符 |
/= | 除法赋值复合运算符 |
%= | 求余赋值复合运算符 |
&= | 位与赋值复合运算符 |
//= | 位或赋值复合运算符 |
^= | 位异或赋值复合运算符 |
>>= | 位右移赋值复合运算符 |
<<= | 位左移赋值复合运算符 |
赋值表达式
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b = 10;
b += a;
printf("%d\n",b);
b -= a;
printf("%d\n",b);
b *= a;
printf("%d\n",b);
b /= a;
printf("%d\n",b);
b %= a;
printf("%d\n",b);
b &= a;
printf("%d\n",b);
b |= a;
printf("%d\n",b);
b ^= a;
printf("%d\n",b);
b >>= a;
printf("%d\n",b);
b <<= a;
printf("%d\n",b);
return 0;
}
其他运算符
逗号运算符
逗号运算符其功能是把两个表达式连接起来组成一个表达式
表达式1,表达式2
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5,b = 10,c;
c = (a += 5,b = a + 2);
printf("a = %d\nb = %d\nc = %d\n",a,b,c);
return 0;
}
条件运算符
条件运算符(?:)是唯一一个三目运算符,它提供如if-then-else 语句的简易操作
<表达式1> ? <表达式2> : <表达式3>
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 10,b = 5,c;
c = (a > b) ? a : b;
printf("c = %d\n",c);
return 0;
}
sizeof
sizeof是一个单目运算符,它的运算对象是变量或数据类型,运算结果为一个整数
若运算对象为变量,则所求的结果时这个变量占用的内存空间字节数
若运算对象是数据类型,则所求结果是这种数据类型的变量占用的内存空间字节数
举个栗子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 5;
float b = 1.23;
double c = 4.56;
char d = 'd';
char *e = "sfdsfsdfs";
printf("a size = %d\n",sizeof(a));
printf("b size = %d\n",sizeof(b));
printf("c size = %d\n",sizeof(c));
printf("d size = %d\n",sizeof(d));
printf("e size = %d\n",sizeof(e));
printf("int size = %d\n",sizeof(int));
printf("float size = %d\n",sizeof(float));
printf("double size = %d\n",sizeof(double));
printf("char size = %d\n",sizeof(char));
return 0;
}
优先级
优先级表格
优先级 | 运算符 | 含义 | 运算对象个数 | 结合方向 |
---|---|---|---|---|
1 | 0 | 圆括号 | 自左向右 | |
[] | 下标运算符 | |||
-> | 指向结构体成员运算符 | |||
. | 结构体成员运算符 | |||
2 | ! | 逻辑非运算 | 1(单目) | 自右向左 |
~ | 按位取反运算 | |||
++ | 自增运算符 | |||
– | 自减运算符 | |||
- | 负号运算符 | |||
(类型) | 类型转换运算符 | |||
* | 指针运算符 | |||
& | 地址运算符 | |||
sizeof | 长度运算符 | |||
3 | * | 乘法运算符 | 2(双目) | 自左向右 |
/ | 除法运算符 | |||
% | 求余运算符 | |||
4 | + | 加法运算符 | 2(双目) | 自左向右 |
- | 减法运算符 | |||
5 | << | 左移运算符 | 2(双目) | 自左向右 |
>> | 右移运算符 | |||
6 | < | 小于运算符 | 2(双目) | 自左向右 |
<= | 小于等于运算符 | |||
> | 大于运算符 | |||
>= | 大于等于运算符 | |||
7 | == | 等于运算符 | 2(双目) | 自左向右 |
!= | 不等于运算符 | |||
8 | & | 按位与运算符 | 2(双目) | 自左向右 |
9 | ^ | 按位异或运算符 | 2(双目) | 自左向右 |
10 | 或 | 按位或运算符 | 2(双目) | 自左向右 |
11 | && | 逻辑与运算符 | 2(双目) | 自左向右 |
12 | 或 | 逻辑或运算符 | 2(双目) | 自左向右 |
13 | ?: | 条件运算符 | 3(三目) | 自右向左 |
14 | = | 赋值运算符 | 2(双目) | 自右向左 |
+= | ||||
-= | ||||
*= | ||||
/= | ||||
%= | ||||
>>= | ||||
<<= | ||||
&= | ||||
^= | ||||
或= | ||||
15 | , | 逗号运算符 | 自左向右 |