操作符
操作符分类
算术操作符 + - * / %
移位操作符 >> <<
位操作符 | & ^
赋值操作符 =
单目操作符 ! & ...
关系操作符 > >= < <= != ==
逻辑操作符 && ||
条件操作符 exp1 ? exp2 : exp3
逗号表达式 exp1, exp2, exp3, …expN
下标引用 []
函数调用 ()
算术操作符
+ - * / % --就是加减乘除和取模。要注意取模得到的是余数,除了 % 取模运算符外,其它操作符都能对整数和浮点数进行运算。
移位操作符
移位操作符移动的都是二进制位。
<< 左移操作符
>> 右移操作符
左移操作符
左移操作符就是向左移动,右边补0,比如 3 ,二进制的有效位是 00000011,左移之后的结果就是 00000110 是 6。代码如下:
int main()
{
int a = 3;
int b = a << 1;
printf("%d\n", b); //6
return 0;
}
左移之后,数值变成了原来的二倍,我们可以多试几组数据,尝试得到一个结论:
int main()
{
int a = 5;
int b = a << 1;
printf("%d\n", b); //10
return 0;
}
通过上面两个例子,我们可以得出一个结论:向左移一位,就会把结果乘 2 ,继续推断可知,左移 n 位,就是把结果乘 2^n 。
右移操作符
右移操作符的移位方式是算术右移,就是左边用原值的符号位填充,右边丢弃。
int main()
{
int a = 80;
int b = a >> 1;
printf("%d\n", b); //40
return 0;
}
int main()
{
int a = 80;
int b = a >> 3;
printf("%d\n", b); //10
return 0;
}
经过上面这两个代码,我们依然可以验证我们的结论:右移 n 位,就是把结果除 2^n 。
位操作符
位操作符包括 &(按位与) |(按位或) ^ (按位异或),操作的也是二进制位。
按位与 &
两个数对应的二进制位都是 1 ,那么按位与的结果也是 1 ,有一个为 0 ,结果为 0 。这里拿 3 和 5 举例。3 对应的的二进制的有效位是 00000011 ,5 对应的二进制的有效位是 00000101 ,所以按位与的结果就是 1 。
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("%d\n", c); //1
return 0;
}
再结合图片,就能很好理解了。
按位或 |
按位或也是对两个数的二进制位进行操作,两个数对应的二进制位,只要有一个 1 ,结果就为 1 。继续拿 3 和 5 举例。3 的有效二进制位是 00000011,5 的二进制的有效位是 00000101,按位或之后就是 00000111 是 7 。
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("%d\n", c); //7
return 0;
}
从图片上面就很好理解了。
按位异或 ^
按位异或就是两个数对应的二进制位相同则为 0 ,相异则为 1 。继续拿 3 和 5 举例,00000011,00000101,所以结果就是 00000110,结果是 6 。
赋值操作符
赋值操作符有如下
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些操作符的效果都类似于下面这样:
int x = 10;
x = x+10;
x += 10; += 的意思和 + 是一样的 所以这个式子和上面的式子是一样的
单目操作符
单目操作符就是符号两边的操作数只有一个。
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
逻辑反操作:比如原来为真,逻辑反操作之后就为假了。原来为假的话,逻辑反操作之后就是 1 ,0 表示假,一切的非 0 表示真。
int main()
{
int a = 3;
int b = !a;
int c = !b;
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
要注意两个 + 不能使负数变为正数。
sizeof 和 数组
sizeof 作为一个操作符,是求元素所占字节大小的,sizeof(数组名),求的是整个数组的大小,与 strlen 不同的是,strlen 算的是有几个字符,而 sizeof 算的是所有的大小,不关注内容,只关注大小。
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]);
int len = strlen(arr);
printf("%d\n", sz); //7
printf("%d\n", len); //6
return 0;
}
sizeof 等于 7 是因为字符串结束的标志是 ‘\0’ 所以求出来是 7,而字符串只有 6 个,所以 strlen 是 6。
关系操作符
关系操作符就是常见的比较大小的操作符。
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
逻辑操作符有 &&(逻辑与) ||(逻辑或)
逻辑与:就是符号两边都为真,结果才为真。
逻辑或:就是符号两边有一个为真,结果就为真。
int main()
{
int a = 3;
int b = 5;
int c = 0;
if (a > 0 && b > 0)
{
printf("逻辑与操作符\n");
}
if (a > 0 || c > 0)
{
printf("逻辑或操作符\n");
}
return 0;
}
通过图片可知结果都输出了,可以更方便的理解。
条件操作符
条件操作符 exp1 ? exp2 : exp3 又叫三目操作符。当表达式 1 成立的话,就执行表达式 2 ,表达式 1 为假的话,就执行表达式 3 。
int main()
{
int a = 3;
int b = 5;
int c = a > b ? a : b;
printf("%d\n", c); //5
return 0;
}
因为 a > b 判断为假,所以执行表达式 3 ,c 的值就等于 b 了,所以 c j就是 5 。
逗号表达式
exp1, exp2, exp3, …expN 多个表达式用逗号隔开,从左到右执行。最后一个表达式的结果是整个表达式的结果。
int main()
{
int a = 3;
int c = (a + 1, a + 1, a + 1, a + 1, a + 1);
printf("%d\n", c); //4
return 0;
}
这里输出的是 4 因为逗号表达式的最后一个式子是 a+1 所以结果是 4 。因为 a 的值并没有被改变,所以是 4 。如果把逗号表达式都变成 a += 1 这样的结果就是 8 ,因为每次都把 a 的值改变了。
下标引用和函数调用
下标引用操作符 []
用于数组当中,因为数组是通过下标来访问的。数组的下标是从 0 开始的。
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[9]); //10
return 0;
}
因为下标是从 0 开始访问的,所以输出的就是 10 。
函数调用操作符()
函数调用操作符就是还有传多个参数,也可以不传参数。
void test2(int x)
{
printf("%d\n", x);
}
void test1()
{
int a = 5;
test2(a);
}
int main()
{
test1();
return 0;
}
从 main 函数开始,先调用 test1 函数,没有传参数,再从 test1 函数里面调用 test2 然后传参,test2 函数用 x 来接收,并且打印出来。