1.算术操作符
+ - * / %
1.1加(+)减(-)
+ 和 - ⽤来完成加法和减法。 + 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双⽬操作符。
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int c=a+b;
printf("%d",c);
return 0;
}
1.2 *
*用来完成乘法操作
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 输出 25
return 0;
}
1.3 /
/用来完成除法操作
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x); // 输出 1.000000
printf("%d\n", y); // 输出 1
return 0;
}
上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是 1.5 。原因就在于 C 语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
1.4 %
取模运算
//运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。
#include <stdio.h>
int main()
{
int x = 6 % 4; // 2
return 0;
}
对于负数求模的规则是:符号由第一个运算数的符号决定
2.移位操作符
<<左移操作符
>>右移操作符
注:移位操作符的操作数只能是整数
2.1左移操作符
移位规则:左边抛弃,右边补0
需要注意的是此时num左移之后得到了20,但是num本身的值并没有改变
2.2右移操作符
移位规则:
2.2.1逻辑右移:左边用0填充,右边抛弃
2.2.2算术右移:左边用原符号位数字填充,右边抛弃
对于移位运算符只能移动正数个操作位
3.位操作符
3.1 按位与 &
两个数的每一个二进制位进行按位与,负数则以补码的形式进行按位与
规则:0&0=0 0&1=0 1&1=1
记忆:都为1才是1
#include<stdio.h>
int main()
{
int num1 = -3;
int num2 = 4 ;
printf("%d",num1&num2);
return 0;
}
3.2按位或 |
规则:0|0=0 0|1=1 1|1=1
记忆:有1就是1
3.3按位异或^
规则:0^0=0 0^1=1 1^1=0 1^0=1
记忆:相同为0 ,不同为1
异或^满足几个规律
1)a^a=0
2) a^0=a
3) a^b=b^a
4) a^b^c=(a^b)^c=a^(b^c)
5) a^b^a=b
了解^的性质之后做一个练习题:
在不创建第三个变量的情况下交换两个数的值
这道题主要就是考察异或的运用,和思维的发散,以及对深层原理的理解程度
#include<stido.h>
int main()
{
int a = 10, b = 21;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);
return 0;
}
4.赋值操作符:=和复合赋值
4.1赋值
在变量进行创建的时候给一个初始值叫做初始化,在变量创建好之后,再给一个值,这叫赋值
int a=0;//初始化
a=10;//赋值
4.2连续赋值:
b=b+a 等价于b+=a
类似的b=b-a 等价于b-=a
5.单目操作符
何为单目操作符?顾名思义,就是使用时只需要一个变量就可以实现的操作符(操作数为1),而不是像+ - * /这种运算操作一样必须要有两个数才能实现运算。那么单目操作符有哪些呢?
- ! 逻辑反操作
- - 负值
- + 正值
- & 取地址
- sizeof 操作数的类型长度(以字节为单位)
- ~ 对一个数的二进制按位取反
- -- 前置、后置--
- ++ 前置、后置++
- * 间接访问操作符(解引用操作符)
- (类型) 强制类型转换
!是逻辑取反,例如:int a=10;b = !a; 此时的b就是0。因为a>0为真,逻辑取反就是0
~是按照二进制位的每一位惊醒取反操作,例如:
-1内存中的补码:11111111111111111111111111111111
~-1:00000000000000000000000000000000
~-1就是0
前置++ --和后置++ --
前置++ --是先进行自增或自减之后再进行后续的计算
后置++ --是先进行计算之后再自增或自减
其他操作符较为常见,再次不再赘述
6.关系操作符
- 大于(>)
- 小于(<)
- 大于等于(>=)
- 小于等于(<=)
- 等于(==)
- 不等于(!=)
关系操作符有以上几种,等于和不等于适用于所有的类型,其他的操作符不适用于布尔类型,因为布尔类型只有ture和false
7.逻辑操作符
常见的逻辑操作符有三种
逻辑与(AND)
符号:&&
A&&B 当A和B都为真的时候A&&B为真
逻辑或(OR)
符号:||
A||B 当A和B有一个为真的时候 A||B 为真
非(NOT)
符号:!
!A
当条件 A 为假时,取反后结果为真。
8.条件操作符
又称三目操作符,可以同时操作三个变量
exp1?exp2:exp3
如果表达式1为真,那么就计算表达式2,表达式2的结果为整个式子的 结果;如果表达式1为假,那么就计算表达式3,表达式3的结果为整个式子的结果。
-
例:问:将下列式子转化为条件表达式是什么样的?
if (a > 5)
b = 3;
else
b = -3;
答:
b = (a > 5 ? 3 : -3);
9.逗号表达式
逗号表达式,就是⽤逗号隔开的多个表达式。 逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
/代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c=13
//代码2
if (a =b + 1, c=a / 2, d > 0)
//此时的判断条件只有d>0
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
a = get_val();
count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
//业务处理
}
10.下标访问 [ ]、函数调用()
10.1下标访问[ ]
操作数:⼀个数组名 + ⼀个索引值
int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
[ ]的两个操作数是arr和9。
10.2函数调用操作符 ()
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //这⾥的()就是作为函数调⽤操作符。
test2("hello");//这⾥的()就是函数调⽤操作符。
return 0;
}
11.操作符的属性:优先级、结合性
11.1优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的。
1 3 + 4 * 5;
上⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4 。
11.2结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )。
1 5 * 6 / 2;
上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 , 再计算 6 / 2 。运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排 列),建议⼤概记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了。
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
() | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | -- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |
感谢阅读,新手小白若有错误请指出。