目录
一.操作符的分类
算术操作符:+,–,*,/,%
移位操作符:>>,<<
结构成员访问:.,–>
其中,大部分都较为简单和基础,在之前的学习中都学习到并且在编程中都有掌握,接下来就选择几个介绍
二.关系操作符
> < >= <= == !=
多个关系运算符不宜连用
三.条件操作符
exp1 ? exp2 :exp3
例子1
int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d", &a);
// if (a > 5)
// {
// if (a > 5)
// {
// b = 3;
// }
// else
// {
// b = -3;
// }
// printf("%d\n", b);
// return 0;
// }
//}
int main()
{
int a = 0;
scanf("%d", &a);
int b = a > 5 ? 3 : -3;
printf("%d\n", b);
return 0;
}
例子2
//使用条件表达式实现两个数中的最大值
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = a > b ? a : b;
printf("%d\n", ret);
}
四.逻辑操作符
&& | | !
!:取反(改变单个表达式的真假)
&&:与运算符,两边都是真才是真,否则是假
| |:或运算符,两边至少有一个为真就是真,否则就是假
短路
对于&&来说,如果已经确定左边的表达式是错误的,那么就不用对右边的表达式进行计算
对于| |来说,如果左边的表达式是真的,那么就不用在判断右边的表达式
五.移位操作符
(1)左移操作符<<
移动规则:左边抛弃,右边补0
(2)右移操作符
移位规则
逻辑右移:左边用0填充,右边丢弃
算术右移:左边用原该值的符号位填充,右边丢弃
大部分算术右移是算数右移
不要移动负数位!
int main()
{
int n = 10;
int m = n << 1;
printf("%d\n", n);
printf("%d\n", m);
return 0;
}
代码结果如下
为什么是这个结果呢?
10的二进制是1010
10 / 2 =5 0
5 / 2 = 2 1
2 / 2 = 1 0
1 / 2 =0 1
原码是00000000000000000000000000001010
左移之后是00000000000000000000000000010100,即为4+16 =20
2.位操作符(操作数必须是整数)
计算规则:
&–对应的二进制位进行与运算,只要有0就是 0,同时为1才是1
|–对应的二进制位进行或运算,只要有1就 是1,同时为0才是0
^–异或运算,相同为0,相异为1
~–除符号位剩下的全部取反
代码示例
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);
printf("%d\n", num1 | num2);
printf("%d\n", num1 ^ num2);
printf("%d\n", ~0);
return 0;
}
可知,-3的二进制是10000000000000000000000000001101
5的二进制是00000000000000000000000000000101
&运算为00000000000000000000000000000101
|运算为100000000000000000000000000000011
^运算为100000000000000000000000000001000
运算结果是
3.逗号表达式
从左到右依次执行。整个表达式的结果是最后一个表达式的结果
4.函数调用操作符
接受一个或多个操作数,第一个操作数是函数名,其余的操作数就是传递给函数的参数
代码举例
void test1()
{
printf("hehe\n");
}
void test2(const char * str)
{
printf("%s", str);
}
int main()
{
test1();
test2("never give up.");
return 0;
}
函数调用部分是
void test1()
{
printf("hehe\n");
}
void test2(const char * str)
{
printf("%s", str);
}
此时,函数调用操作符所在的地方是
test1();
test2("never give up.");