一、运算符
(1)在C语言中,/
, %
, >>
, <<
, &
, |
, ^
是常用的运算符,它们各自代表如下功能:
-
/
:除法运算符。它用于两个数的除法运算,如a / b
,表示将a
除以b
。 -
%
:取模运算符或余数运算符。它用于计算两个整数相除的余数,如a % b
。 -
>>
:右移运算符。它用于将一个数的所有位向右移动指定的位数,如a >> 2
,表示将a
的二进制表示向右移动两位。 -
<<
:左移运算符。它用于将一个数的所有位向左移动指定的位数,如a << 2
,表示将a
的二进制表示向左移动两位。 -
&
:按位与运算符。它用于对两个数的二进制表示进行按位与操作,只有当两个相应的二进制位都为1时,结果位才为1,否则为0。 -
|
:按位或运算符。它用于对两个数的二进制表示进行按位或操作,只要两个相应的二进制位中有一个为1时,结果位就为1。 -
^
:按位异或运算符。它用于对两个数的二进制表示进行按位异或操作,当两个相应的二进制位相异时(一个为1,另一个为0),结果位为1,否则为0。
(2)复合赋值符
二、二进制操作符
int main()
{
//(2进制)位操作
//& 按位与
//| 按位或
//^ 按位异或
int a = 2;
int b = 3;
int c = a & b;
int d = a | b;
int e = a ^ b;
printf("以下是2进制位操作。\n其中\"&\"是按位与,\"|\"是按位或,\"^\"是按位异或\n,\ta=2 b=3\n");
printf("a & b = %d\n", c);
printf("a | b = %d\n", d);
printf("a ^ b =%d\n", e);
return 0;
}
三、单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
(1)! 逻辑反操作
在C语言中,!
是逻辑非运算符(Logical NOT operator)。这个运算符用于对布尔表达式的结果取反。其操作方式是:如果其后的表达式为真(即非零),则 !
运算的结果为假(0);如果其后的表达式为假(即零),则 !
运算的结果为真(1)。
这里有一些使用 !
运算符的示例:
-
!0
的结果是1
,因为0表示假,逻辑非将其转换为真。 -
!1
的结果是0
,因为1表示真,逻辑非将其转换为假。 - 如果
x
是一个变量,!x
将会是1
(真),如果x
为0
;如果x
非0
,!x
将会是0
(假)。
在条件判断中,这个运算符经常被使用。例如:
int x = 5;
if (!x) {
// 这个代码块不会被执行,因为 !x 的值是 0(假),因为 x 是非零的。
}
int y = 0;
if (!y) {
// 这个代码块会被执行,因为 !y 的值是 1(真),因为 y 是零。
}
在实际编程中,!
运算符通常用于检查一个变量是否为“非真”(即假),或者用于反转一个条件的逻辑意义。
(2)& 逻辑取地址
在C语言中,符号 &
有两个主要用途,分别是作为按位与运算符和取地址运算符。
- 按位与运算符(Bitwise AND Operator):
- 当
&
用作按位与运算符时,它对两个整数的二进制表示进行操作。具体来说,它逐位比较两个数的二进制形式,只有当相同位置的两个位都为1时,结果在该位置上的位才为1,否则为0。 - 例如,
5 & 3
在二进制中相当于0101 & 0011
,其结果是0001
,即十进制中的1
。
- 取地址运算符(Address-of Operator):
- 当
&
用作取地址运算符时,它用于获取变量的内存地址。在C语言中,理解指针和内存地址是非常重要的,而&
运算符就是用于获取一个变量的内存地址。 - 例如,如果有一个变量
int x = 10;
,那么表达式&x
将给出变量x
存储的内存地址。
这两种用法是完全不同的,使用时要根据上下文区分。在C语言中,正确理解和使用 &
运算符非常重要,因为它涉及到底层的内存操作和数据处理。
(3)~ 对一个数的二进制按位取反
在C语言中,~
符号是按位取反运算符(Bitwise NOT operator)。它用于对一个整数的二进制表示进行按位取反操作。这意味着该操作会将数字的每一个二进制位翻转:将0变成1,将1变成0。
以下是按位取反运算符的一些关键点:
-
操作方式:对于一个给定的二进制数,
~
运算符将每个1变为0,每个0变为1。例如,如果一个字节(8位)的值是10110010
,那么应用~
运算符后,它将变成01001101
。 - 使用场景:按位取反在进行底层位操作时非常有用,尤其是在涉及位掩码和数据表示的操作中。
-
补码表示:在大多数现代计算机中,整数以补码(Two's Complement)形式表示。在这种情况下,
~
运算符的应用会导致结果与原数值的符号相反,并且绝对值减一。例如,对于一个32位整型数,~0
结果是-1
(因为0的所有位都是0,取反后变成了所有位都是1,这在补码表示中等同于-1)。 -
示例:在C代码中,如果你有
int x = 5;
,那么~x
将会产生-6
(在32位整数中,5的二进制表示为0000 0000 0000 0000 0000 0000 0000 0101
,取反后变为1111 1111 1111 1111 1111 1111 1111 1010
,即-6)。
这个运算符在日常应用中不如加减乘除那么常见,但在需要直接操作位时,它是非常重要的工具。
演示代码:
#include <stdio.h>
int main()
{
int a = -10;
int *p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//这样写行
printf("%d\n", sizeof int);//这样写不行!!!
return 0;
}
(2)后置++ or --,前置++ or --
-a.后置++,先赋值,再++
int main()
{
int a = 10;
int b = a++;
printf("a = %d,b = %d", a, b);//先把a赋值给b,然后a再+1
return 0;
}
-b.前置++,先++,再赋值
int main()
{
int a = 10;
int b = ++a;
printf("a = %d, b = %d", a, b);
return 0;
}