赋值/条件/位运算符的应用
一.赋值运算符
常见的赋值运算符:= += -= *= /= >>= <<= &= != ^= ~=
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;
}
更多推荐
所有评论(0)