目录:
1.单目操作符
! //逻辑反操作
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度(以字节为单位)
~ //对一个数的二进制按位取反
-- //前置,后置--
++ //前置,后置++
* //间接访问操作符(解引用操作符)
(类型) //强制类型转换
(1)逻辑取反(!)
!0返回1;
!(非0)返回0;
因为0是假,非0是真,所以0取反为真返回1,非0取反为假返回0;
#include<stdio.h>
int main()
{
printf("%d\n", !0);
printf("%d\n", !2);
printf("%d\n", !(-1));
return 0;
}
(2)按位取反(~)
按位取反转换过来的二进制都是补码(包括符号位所有位置都取反)
eg1:求~1
#include<stdio.h>
int main()
{
printf("%d\n", ~1);
return 0;
}
eg2: ~(-1)
#include<stdio.h>
int main()
{
printf("%d\n", ~(-1));
return 0;
}
2.逻辑操作符
&& //逻辑与 有假为假
|| //逻辑或 有真为真
#include<stdio.h>
int main()
{
printf("%d\n", 1 && 0);
printf("%d\n", 1 && (-2));
printf("%d\n", 1 || 0);
printf("%d\n", 1 || (-2));
return 0;
}
eg1:360笔试题
#include<stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("i=%d\n a=%d\n b=%d\n c=%d\n d=%d\n",i, a, b, c, d);
return 0;
}
解析:
a++返回的是0;然后++所以a=1
++b先++b=3然后返回3
因为逻辑或||有真(非0)为真;所以b以后的就没必要执行,所以i=1
c=3,d=4;
eg2:例一变形
#include<stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("i=%d\n a=%d\n b=%d\n c=%d\n d=%d\n",i, a, b, c, d);
return 0;
}
解析:
a++返回的是0;然后++所以a=1
因为逻辑与&&有假(0)为假;所以a以后的就没必要执行,所以i=0,
b=2,c=3,d=4;
3.条件操作符
exp1?exp2:exp3
举例说明:
#include<stdio.h>
int Max(int a, int b)
{
if (a > b)
{
return a;
}
return b;
}
int main()
{
int x = 1,y = 2;
printf("%d\n",Max(x,y));
return 0;
}
如上代码用条件操作符写
#include<stdio.h>
int Max(int a,int b)
{
return (a > b ? a : b);
}
int main()
{
int x = 1,y = 2;
printf("%d\n",Max(x,y));
return 0;
}
4.逗号表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
#include<stdio.h>
int main()
{
int a = 1, b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d\n", c);
return 0;
}
5.下标引用
[] //下标引用操作符
操作符:一个数组名+一个索引值
int arr[10];
arr[9] = 10;
[]的两个操作数是arr和9
注:arr[9]等价于*(arr+9)
6.表达式求值的顺序
表达式的求值顺序的影响因素:
(1)操作符的优先级(优先级只能确定相邻两个操作符执行优先级 )
(2)操作符的结合性
(3)是否控制求值顺序
注:复杂表达式很容易出现歧义,因此一个表达式不要套多个操作符
7.连续赋值
#include<stdio.h>
int main()
{
int a = 1, b = 2;
a = b = 20;
printf("a=%d b=%d\n", a,b);
return 0;
}