一.赋值运算符

常见的赋值运算符:=   +=   -=   *=   /=   >>=   <<=   &=   !=   ^=   ~=

1.基本赋值运算符

1. 简单赋值
2. 连续赋值

使用示例:

int main() {
  int a, b, c;
  printf("=== 基本赋值运算符 ===\n");
  // 简单赋值
  a = 10;
  printf("a = 10 → a = %d\n", a);
  // 连续赋值
  a = b = c = 100;
  printf("a = b = c = 100 → a=%d, b=%d, c=%d\n", a, b, c);
  return 0;
}

2.复合赋值运算符

+=   -=   *=   /=  %=

使用示例如下:

int main() {
  int a = 10;
  printf("=== 复合赋值运算符 ===\n");
  printf("初始值: a = %d\n", a);
  a += 5;
  // a = a + 5
  printf("a += 5 → a = %d\n", a);
  a -= 3;
  // a = a - 3
  printf("a -= 3 → a = %d\n", a);
  a *= 2;
  // a = a * 2
  printf("a *= 2 → a = %d\n", a);
  a /= 4;
  // a = a / 4
  printf("a /= 4 → a = %d\n", a);
  a %= 3;
  // a = a % 3
  printf("a %%= 3 → a = %d\n", a);
  return 0;
}

注:在printf中想在面板上输入“%”,需要使用转义字符“%%”;

3.赋值运算符返回值

赋值表达式本⾝有返回值,返回被赋的值

nt main()
{
	int a, b, c;
	printf("=== 赋值运算的返回值 ===\n");
	// 赋值表达式本⾝有返回值,返回被赋的值
	a = (b = 10) + 5;
	printf("a = (b = 10) + 5 → a=%d, b=%d\n", a, b);
	// 在条件判断中使⽤赋值
	if ((c = 20) > 15) {
		printf("赋值表达式在条件中: c=%d\n", c);
	}
	a = b = c = 100;
	printf("连续赋值: a=%d, b=%d, c=%d\n", a, b, c);
	return 0;
}

二.条件运算符

expr?expr1:expr2
也叫三⽬运算符,是C语⾔中唯⼀的⼀个三⽬运算符,需要三个操作数

1.基本使用示例:

#include <stdio.h>
int main() {
int a = 10, b = 20;
int max;
printf("=== 条件运算符基本⽤法 ===\n");
// 语法:条件 ? 表达式1 : 表达式2
max = (a > b) ? a : b;
printf("a=%d, b=%d, 较⼤值是: %d\n", a, b, max);
// 直接输出
printf("a和b中较⼩的数是: %d\n", (a < b) ? a : b);
return 0;
}

2.三目运算符的嵌套使用

计算成绩等级程序示例:

int main() {
int score;
printf("=== 条件运算符嵌套 ===\n");
printf("请输⼊成绩: ");
scanf("%d", &score);
// 嵌套条件运算符判断等级
char grade = (score >= 90) ? 'A' :
(score >= 80) ? 'B' :
(score >= 70) ? 'C' :
(score >= 60) ? 'D' : 'E';
printf("成绩等级: %c\n", grade);
// 判断奇偶性
int num = 15;
printf("%d是%s数\n", num, (num % 2 == 0) ? "偶" : "奇");
return 0;
}

3.条件运算符 vs if-else

1. 条件运算符能够实现if-else相同的功能
2. 条件运算符也能够实现更复杂的if-else if-else判断操作,但不推荐
3. 推荐
a. 简单的赋值操作:int max =(a>b)?a:b;
b. 函数参数或返回值当中:return (age >= 18) ? ADULT :MINOR;
c. 初始化表达式:const char* file_mode = (write_mode) ? "w" : "r";

三.位运算符

1.常见的位运算符

1.按位与(&):

只有当对应位都为1时,结果位才为1,否则为0。

2.按位或(|):
只要对应位有⼀个为1,结果位就为1,否则为0。

3.按位异或(^):

当对应位不同时(⼀个1⼀个0),结果位为1,否则为0。

4.按位取反(~):
对每个⼆进制位进⾏取反操作,1变0,0变1。

5.左移运算符(<<)
将⼆进制位向左移动指定的位数,右侧空位补0。

6.右移运算符(>>)
将⼆进制位向右移动指定的位数,左侧空位的填充⽅式取决于数据类型。
• 对⽆符号数:左侧补0(逻辑右移)
• 对有符号数:左侧补符号位(算术右移)

2.左移右移的常见问题

1.左移导致数据溢出

符号位可能发⽣变化
char num << 1 会出现整数提升,按照int四字节左移,强制类型转换后数据截断
移动有效位数后,变为0

示例:

int main() {
printf("=== char左移溢出情况 ===\n");
unsigned char num = 1;
// 00000001
printf("1 << 0 = %d\n", num << 0);
// 1
printf("1 << 1 = %d\n", num << 1);
// 2
printf("1 << 2 = %d\n", num << 2);
// 4
printf("1 << 6 = %d\n", num << 6);
// 64 (01000000)
printf("1 << 7 = %d\n", num << 7);
// 128 (10000000)
printf("1 << 8 = %d (溢出! char只有8位)\n", (unsigned char)(num << 8));
//
256→
0
printf("\n有符号char测试:\n");
char signed_num = 64;
// 01000000
printf("64 << 1 = %d (128,但char范围-128~127,溢出!)\n", (char)(signed_num
<< 1));
return 0;
}

2.右移导致数据丢失

右移有时会将有效位数移出有效字节内,导致数据丢失

#include <stdio.h>
int main() {
printf("=== char右移数据丢失 ===\n");
unsigned char num = 7;
// 00000111
printf("7 >> 1 = %d (丢失最低位1)\n", num >> 1);
// 3 (00000011)
printf("7 >> 2 = %d (丢失低2位)\n", num >> 2);
// 1 (00000001)
printf("7 >> 3 = %d (所有有效位都丢失)\n", num >> 3);
// 0 (00000000)
// ⼩数部分直接截断
printf("5 >> 1 = %d (2.5截断为2)\n", 5 >> 1);
// 2
return 0;
}

3. 有符号char右移的特殊情况

正数右移到最后,变为0
负数右移到最后,变为-1(因为一直补1)

示例:

int main() {
printf("=== 有符号char右移 ===\n");
char positive = 8;
// 00001000
char negative = -8;
// 11111000 (补码)
printf("正数右移:\n");
printf("8 >> 1 = %d\n", positive >> 1);
// 4 (00000100)
printf("8 >> 2 = %d\n", positive >> 2);
// 2 (00000010)
printf("8 >> 4 = %d\n", positive >> 4);
// 0 (00000000)
printf("\n负数右移(算术右移):\n");
printf("-8 >> 1 = %d (左侧补1)\n", negative >> 1);
// -4 (11111100)
printf("-8 >> 2 = %d (左侧补1)\n", negative >> 2);
// -2 (11111110)
printf("-8 >> 4 = %d (还是-1,因为⼀直补1)\n", negative >> 4);
// -1
(11111111)
printf("-1 >> 任何位数 = -1 (因为⼀直补1)\n");
printf("-1 >> 3 = %d\n", (char)-1 >> 3);
// -1
return 0;
}

3.位运算使用限制

位运算符(&、|、^、~、<<、>>)仅对整数的⼆进制位操作,不⽤于浮点数
操作数应该是整数类型(int,char,short,long等)
不要混淆位运算符与逻辑运算符(&&逻辑与、||逻辑或),后者⽤于判断条件真假,返回布尔值

使用示例:

注意:在C/C++中,0b 前缀表示二进制字面量(binary literal)。

int main()
{
		unsigned char a = 0b01010101;
		// 85
		printf("=== 位运算复合赋值 ===\n");
		printf("初始值: %d\n", a);
		a &= 0b00001111;
		// 清零⾼4位
		printf("a &= 0x0F → %d\n", a);
		a |= 0b11110000;
		// 设置⾼4位
		printf("a |= 0xF0 → %d\n", a);
		a ^= 0b11111111;
		// 按位取反
		printf("a ^= 0xFF → %d\n", a);
	return 0;
}

例:不用临时变量交换变量的值

#include <stdio.h>
int main() 
{
  printf("=== 位运算实⽤技巧 ===\n");
  // 2. 交换两个变量的值(不使⽤临时变量)
  int x = 10, y = 20;
  printf("交换前: x=%d, y=%d\n", x, y);
  x = x ^ y;
  y = x ^ y;
  x = x ^ y;
  printf("交换后: x=%d, y=%d\n", x, y);
  return 0;
}

例:位运算求某数对于2的幂的模值

int main()
{
	printf("=== 位运算实⽤技巧 ===\n");
	// 3. 取模运算(对2的幂取模)
	int num3 = 23;
	int mod = num3 & 15;
	// 相当于 num3 % 16
	printf("%d %% 16 = %d\n", num3, mod);
	return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐