C语言操作符
1.操作符:指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。
2.C语言操作符的分类:
1. 算数操作数
2. 移位操作符
3. 位操作
4. 赋值操作符
5. 单目操作符
6. 关系操作符
7. 逻辑操作符
8. 条件操作符
9. 逗号表达式
10. 下标引用,函数调用和结构成员这里插入代码片
算术操作符(不要移动负数位):
算术操作符有:+ - * / %
注意:
*.除了‘%’操作符之外,其他的几个操作符可以作用于整数和浮点数。
*.对于‘/’操作符如果执行两个操作都为整数,执行整数除法。而浮点数执行的就是浮点数除法。
*.‘%’操作符的两个操作符必须为整数,返回的是整除之后的余数。
移位操作符:
(1).移位操作符:位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
(2).移位操作符分类:
左移操作符(把一个数的所有位都向左移动若干位):<<
右移操作符(把一个数的所有位都向右移动若干位):>>
(3).移位规则:
*. 左移规则:左边抛弃,右边补0。
int num=10;
"00000000000000000000000000001010" //在内存中的二进制
丢掉<-(0)"00000000000000000000000000010100" //左移结果
注意:左移先将数据存在CPU中,例如int类型空间有32个比特位,高位移出,低位补0;
一个数在自身没有赋值的情况下,自身的值不会变。
*.右移规则:逻辑移位(左边用0填充,右边丢弃),算术移位(左边用该值的符号填充,右边丢弃)
int num=-1;
在内存中储存的补码为32个全一;
算术右移:左边用符号位填充
‘11111111111111111111111111111111’(1)->丢弃 因为num是负数所以左边补1逻辑
逻辑右移:左边补0
‘01111111111111111111111111111111’(1)->丢弃
总结:左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.
位操作符:
1,位操作符有:&(按位与),|(按位或),^(按位异或)
2.位操作符的操作数必须为整数。
-
(1)按位与运算:
按位 “与” 运算符 & 的作用是对运算符两侧以二进制表达的操作数按位分别进行 “与” 运算,而这一运算是以 数中相同的位 (bit) 为单位的。操作的规则是:仅当两个操作数都为 1 时,输出的结果才为 1 ,否则为 0 。
如:
int a=1;
int b=2;
int main(){
a&b;
}
结果为0
1:00000……001
& 2:00000……010
---------------
0:00000……000
(2)按位或运算:
按位 “或” 运算符 | 的作用是对运算符两侧以二进制表达的操作数按位分别进行 “或” 运算,而这一运算是以数中相同的位 (bit) 为单位的。操作的规则是:仅当两个操作数都为 0 时,输出的结果才为 0 ,否则为 1 。
如:
int a=1;
int b=2;
int main(){
a&b;
}
结果为0
1:00000……001
| 2:00000……010
---------------
3:00000……011
(3)按位异或运算:
按位 “异或” 运算符 ^ 的作用是对运算符两侧以二进制表达的操作数按位分别进行 “异 或”运算,而这一运算是以数中相同的位 (bit) 为单位的。异或运算操作的规则是:仅当两个 操作数不同时,相应的输出结果才为 1 ,否则为 0 。
运算规则:相同比特位异或就会清零,任何数和零异或等于它本身;
如:
在int a=1;
int b=2;
int main(){
a&b;
}
结果为0
1:00000……001
^ 2:00000……010
---------------
3:00000……011这里插入代码片
异或运算例题:不创建临时变量,实现两个数的交换。
int main(){
int a=10;
int b=20;
a=a^b;
b=a^b;
a=a^b;
}
赋值操作符:
1.赋值操作符‘=’,由“=”链接的表达式为赋值表达式。
2.如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。
3.在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。
如:
int a=2;
a=a+2; ->可以简写成:a+=2
单目操作符:
1.单目运算符是指运算所需变量为一个的运算符,又叫一元运算符。
2.单目运算符分类:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++, --】、负号运算符【-】、类型转换运算符【(类型)】(只改变类型不改变值)、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】()
- 自增和自减【++,–】
(1)前置++和–:先进行自增或自减,然后在在进行操作。
如:
int main(){
int a=2;
int x=++a; //先自增,然后在赋值。x为3
int x=--a; //先自减,然后在赋值。x为1
}
(2)后置++和–:先对数值进行赋值等操作,然后在自增或自减。
原理:先创建一个临时变量存放原来的值,然后原值在进行++或--。赋值的时候讲临时变量进行赋值。
如:
int main(){
int a=2;
int x=++a; //先赋值,然后在自增。x为2,a的值为3
int x=--a; //先赋值,然后在自减。x为3,a的值为2
}
关系操作符:
- 关系操作符有:(<) 小于 , (<= )小于等于 , (>) 大于 ,(>= )大于等于 , (==) 相等 , (!=) 不等。
2.在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
3.关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。
逻辑操作符:
1.分类:(&&)逻辑与,(||) 逻辑或 。
2.逻辑操作符将其操作数视为条件表达式:首先对操作数求值;若结果为0,则条件为假(false),否则为真(true).仅当逻辑与(&&)操作符的两个操作数都为true,其结果才得true.对于逻辑或(||)操作符,只要两个操作符之一为true,它的值就为true.
3.逻辑与:也是只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得出 false。
逻辑或:如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。
例题:
int main(){
int i=0,a=0,b=2,c=3,d=3;
(1) i=a++&&++b&&d++; //i=a++条件为假,后面程序不执行
(2) i=a++&&++b&&d++; //i=a++条件为假,++b条件为真,后面代码不执行
ptintf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
运行结果:(1)abcd:1234
(2)abcd:1334
条件操作符:
1.(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)。
2.含有条件操作符的表达称为条件表达式。
if(a>4)
b=3;
else b=1;
换成条件表达式为:
int z=a>4?3:1;
逗号表达式:
1.逗号表达式是一种特殊的运算符,它可以将两个表达式连接起来,逗号表达式的一般形式是:exp1,exp2,……expn。
2.求解顺序是:先求解表达式1,再求解表达式2,依次类推.整个逗号表达式的值是最后一个表达式的值。
3.例题::(a = 3,b = 5,b+ = a,c = b* 5) 逗号表达式的值为40.
下标引用,函数调用和结构成员:
1.下标引用:[]
操作数:一个数组名+一个索引值
如:
int arr[10];
arr[9]=10; //实用下标引用操作符
[]的两个操作数是arr和9.
2.函数调用操作符:()。
接受一个或者多个操作数,第一个操作是函数名,剩余的操作数就是传递给函数的参数。
例:
void test1(){
printf("hello\n");
}
void test2(const char*str){
printf("%s\n",str);
}
int main(){
tset(); //实用()作为函数调用操作符
test2("holle"); //实用()作为函数调用操作符
}```
3.访问一个结构体的成员:结构体。成员
->结构体指针->成员名
例:
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu)
{
stu.age = 10;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}
操作符的优先级和结合性:
1.优先级:就是当有多个运算符在同一个表达式中出现时,先执行哪个运算符。
2.结合性:就是当一个运算符多次出现时,先执行哪个运算符。
3.在同一表达式中,先执行优先级高的运算符,然后再执行优先级低的运算符;优先级相同的按结合性从左向右或从右向左的顺序执行。
下面为操作符优先级表:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019033121303383.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190331212910504.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)
上一篇: C语言操作符