C语言学习第四天

时间:2024-01-23 20:45:01

一、运算符

(1)在C语言中,/, %, >>, <<, &, |, ^ 是常用的运算符,它们各自代表如下功能:

  1. /:除法运算符。它用于两个数的除法运算,如 a / b,表示将 a 除以 b
  2. %:取模运算符或余数运算符。它用于计算两个整数相除的余数,如 a % b
  3. >>:右移运算符。它用于将一个数的所有位向右移动指定的位数,如 a >> 2,表示将 a 的二进制表示向右移动两位。
  4. <<:左移运算符。它用于将一个数的所有位向左移动指定的位数,如 a << 2,表示将 a 的二进制表示向左移动两位。
  5. &:按位与运算符。它用于对两个数的二进制表示进行按位与操作,只有当两个相应的二进制位都为1时,结果位才为1,否则为0。
  6. |:按位或运算符。它用于对两个数的二进制表示进行按位或操作,只要两个相应的二进制位中有一个为1时,结果位就为1。
  7. ^:按位异或运算符。它用于对两个数的二进制表示进行按位异或操作,当两个相应的二进制位相异时(一个为1,另一个为0),结果位为1,否则为0。

(2)复合赋值符

C语言学习第四天_运算符

C语言学习第四天_位取反_02

二、二进制操作符


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)。

这里有一些使用 ! 运算符的示例:

  1. !0 的结果是 1,因为0表示假,逻辑非将其转换为真。
  2. !1 的结果是 0,因为1表示真,逻辑非将其转换为假。
  3. 如果 x 是一个变量,!x 将会是 1(真),如果 x0;如果 x0!x 将会是 0(假)。

在条件判断中,这个运算符经常被使用。例如:

int x = 5;
if (!x) {
    // 这个代码块不会被执行,因为 !x 的值是 0(假),因为 x 是非零的。
}

int y = 0;
if (!y) {
    // 这个代码块会被执行,因为 !y 的值是 1(真),因为 y 是零。
}

在实际编程中,! 运算符通常用于检查一个变量是否为“非真”(即假),或者用于反转一个条件的逻辑意义。

(2)&  逻辑取地址

在C语言中,符号 & 有两个主要用途,分别是作为按位与运算符和取地址运算符。

  1. 按位与运算符(Bitwise AND Operator):
  • & 用作按位与运算符时,它对两个整数的二进制表示进行操作。具体来说,它逐位比较两个数的二进制形式,只有当相同位置的两个位都为1时,结果在该位置上的位才为1,否则为0。
  • 例如,5 & 3 在二进制中相当于 0101 & 0011,其结果是 0001,即十进制中的 1
  1. 取地址运算符(Address-of Operator):
  • & 用作取地址运算符时,它用于获取变量的内存地址。在C语言中,理解指针和内存地址是非常重要的,而 & 运算符就是用于获取一个变量的内存地址。
  • 例如,如果有一个变量 int x = 10;,那么表达式 &x 将给出变量 x 存储的内存地址。

这两种用法是完全不同的,使用时要根据上下文区分。在C语言中,正确理解和使用 & 运算符非常重要,因为它涉及到底层的内存操作和数据处理。

(3)~ 对一个数的二进制按位取反

在C语言中,~ 符号是按位取反运算符(Bitwise NOT operator)。它用于对一个整数的二进制表示进行按位取反操作。这意味着该操作会将数字的每一个二进制位翻转:将0变成1,将1变成0。

以下是按位取反运算符的一些关键点:

  1. 操作方式:对于一个给定的二进制数,~ 运算符将每个1变为0,每个0变为1。例如,如果一个字节(8位)的值是10110010,那么应用~运算符后,它将变成01001101
  2. 使用场景:按位取反在进行底层位操作时非常有用,尤其是在涉及位掩码和数据表示的操作中。
  3. 补码表示:在大多数现代计算机中,整数以补码(Two's Complement)形式表示。在这种情况下,~ 运算符的应用会导致结果与原数值的符号相反,并且绝对值减一。例如,对于一个32位整型数,~0 结果是 -1(因为0的所有位都是0,取反后变成了所有位都是1,这在补码表示中等同于-1)。
  4. 示例:在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;
}

C语言学习第四天_位取反_03

-b.前置++,先++,再赋值

int main()
{
	int a = 10;
	int b = ++a;
	printf("a = %d, b = %d", a, b);

	return 0;
}

C语言学习第四天_按位与_04