【C 语言】赋值、条件与位运算

一、赋值运算符、

1.1 基本赋值运算符(=)

=是最基础的赋值运算符,用于将右侧表达式的值赋给左侧变量,支持连续赋值

#include <stdio.h>

int main() {
    int a, b, c;
    // 简单赋值
    a = 10;
    printf("a = 10 → a = %d\n", a); // 输出:a = 10
    
    // 连续赋值(从右向左执行)
    a = b = c = 100;
    printf("a = b = c = 100 → a=%d, b=%d, c=%d\n", a, b, c); // 输出:a=100, b=100, c=100
    return 0;
}

1.2 复合赋值运算符

复合赋值运算符将算术 / 位运算与赋值结合,简化代码书写,常见包括+=-=*=/=%=&=|=等。

#include <stdio.h>

int main() {
    int a = 10;
    printf("初始值: a = %d\n", a); // 输出:10
    
    a += 5;  // 等价于 a = a + 5 → 15
    printf("a += 5 → a = %d\n", a);
    
    a -= 3;  // 等价于 a = a - 3 → 12
    printf("a -= 3 → a = %d\n", a);
    
    a *= 2;  // 等价于 a = a * 2 → 24
    printf("a *= 2 → a = %d\n", a);
    
    a /= 4;  // 等价于 a = a / 4 → 6
    printf("a /= 4 → a = %d\n", a);
    
    a %= 3;  // 等价于 a = a % 3 → 0
    printf("a %%= 3 → a = %d\n", a); // 注:%需用%%转义
    
    return 0;
}

1.3 赋值表达式的返回值

赋值表达式本身会返回被赋的值,因此可用于条件判断或表达式嵌套。

#include <stdio.h>

int main() {
    int a, b, c;
    
    // 赋值表达式参与计算
    a = (b = 10) + 5;
    printf("a = (b = 10) + 5 → a=%d, b=%d\n", a, b); // 输出:a=15, b=10
    
    // 条件判断中使用赋值
    if ((c = 20) > 15) {
        printf("赋值表达式在条件中: c=%d\n", c); // 输出:c=20
    }
    
    return 0;
}

二、条件运算符

条件运算符(expr ? expr1 : expr2)是 C 语言中唯一的三目运算符,用于简化if-else逻辑,实现 “条件判断 - 结果选择” 的快速映射。

2.1 基本用法

语法规则:若expr为真,执行expr1;否则执行expr2

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    int max;
    
    // 求两数最大值
    max = (a > b) ? a : b;
    printf("a=%d, b=%d, 较大值是: %d\n", a, b, max); // 输出:20
    
    // 直接嵌入表达式输出
    printf("a和b中较小的数是: %d\n", (a < b) ? a : b); // 输出:10
    
    return 0;
}

2.2 嵌套使用

条件运算符支持嵌套,适用于多分支简单判断(如成绩等级划分)。

#include <stdio.h>

int main() {
    int score;
    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;
}

2.3 条件运算符 与 if-else对比

  • 等效性:条件运算符可实现简单if-else的功能,但嵌套过深会降低可读性。
  • 适用场景
    • 简单赋值:int min = (a < b) ? a : b;
    • 函数参数 / 返回值:return (age >= 18) ? "成年" : "未成年";
    • 常量初始化:const char* mode = (write_flag) ? "w" : "r";

三、位运算符:二进制位的直接操作

位运算符直接对整数的二进制位进行操作,适用于底层硬件控制、性能优化等场景,常见包括按位与、或、异或、取反、移位等。

3.1 基础位运算规则

运算符名称规则
&按位与对应位均为 1 时结果为 1,否则为 0
``按位或对应位有一个为 1 时结果为 1,否则为 0
^按位异或对应位不同时结果为 1,否则为 0
~按位取反每一位取反(1 变 0,0 变 1)
<<左移二进制位左移,右侧补 0
>>右移无符号数左补 0;有符号数左补符号位(算术右移)

3.2 移位运算的注意事项

(1)左移溢出问题

左移可能导致数值超出类型范围(溢出),且char/short类型会先提升为int再运算。

#include <stdio.h>

int main() {
    unsigned char num = 1; // 二进制:00000001
    printf("1 << 7 = %d\n", num << 7); // 输出:128(01000000)
    printf("1 << 8 = %d\n", (unsigned char)(num << 8)); // 溢出后截断为0
    
    char signed_num = 64; // 01000000
    printf("64 << 1 = %d\n", (char)(signed_num << 1)); // 溢出为-128
    
    return 0;
}
(2)右移数据丢失

右移会丢弃右侧低位,有符号负数右移时左侧补 1(最终变为 - 1)。

#include <stdio.h>

int main() {
    unsigned char num = 7; // 00000111
    printf("7 >> 1 = %d\n", num >> 1); // 输出:3(丢失最低位1)
    printf("7 >> 3 = %d\n", num >> 3); // 输出:0(所有有效位丢失)
    
    char negative = -8; // 补码:11111000
    printf("-8 >> 2 = %d\n", negative >> 2); // 输出:-2(算术右移补1)
    printf("-1 >> 3 = %d\n", (char)-1 >> 3); // 输出:-1(始终补1)
    
    return 0;
}

3.3 位运算的实用技巧

(1)复合位赋值运算

结合赋值的位运算,简化代码:

#include <stdio.h>

int main() {
    unsigned char a = 0b01010101; // 85
    a &= 0b00001111; // 清零高4位 → 00000101(5)
    printf("a &= 0x0F → %d\n", a);
    
    a |= 0b11110000; // 设置高4位 → 11110101(245)
    printf("a |= 0xF0 → %d\n", a);
    
    return 0;
}
(2)无临时变量交换值

利用异或运算特性交换两个整数:

#include <stdio.h>

int main() {
    int x = 10, y = 20;
    printf("交换前: x=%d, y=%d\n", x, y);
    
    x = x ^ y;
    y = x ^ y; // 等价于 y = 原x
    x = x ^ y; // 等价于 x = 原y
    
    printf("交换后: x=%d, y=%d\n", x, y); // 输出:x=20, y=10
    
    return 0;
}
(3)2 的幂取模优化

用按位与替代取模(仅适用于 2 的幂):

#include <stdio.h>

int main() {
    int num = 23;
    int mod = num & 15; // 等价于 num % 16(16=2^4)
    printf("%d %% 16 = %d\n", num, mod); // 输出:23 % 16 = 7
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值