【C】算数,关系和逻辑运算符

一、算数运算符

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    
    // 加法
    int sum = a + b;        // 13
    // 减法
    int difference = a - b; // 7
    // 乘法
    int product = a * b;    // 30
    // 除法
    int quotient = a / b;   // 3(a,b均为整形时,结果为整形,有一为浮点时结果为浮点)
    
    // 取模(求余数)
    int remainder = a % b;  // 1
    
    printf("加法: %d + %d = %d\n", a, b, sum);
    printf("减法: %d - %d = %d\n", a, b, difference);
    printf("乘法: %d * %d = %d\n", a, b, product);
    printf("除法: %d / %d = %d\n", a, b, quotient);
    printf("取模: %d %% %d = %d\n", a, b, remainder);
    
    return 0;
}

自增和自减运算符

#include <stdio.h>

int main() {
    int x = 5;
    
    // 前缀自增:先增加,后使用
    int y = ++x;  // x变为6,y也被赋值为6
    
    // 后缀自增:先使用,后增加
    int z = x++;  // z被赋值为6,然后x变为7
    
    printf("x = %d, y = %d, z = %d\n", x, y, z);
    
    // 类似地,自减运算符
    int a = 8;
    int b = --a;  // a变为7,b也被赋值为7
    int c = a--;  // c被赋值为7,然后a变为6
    
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    
    return 0;
}

需要注意的是,同为自增(自减理同)运算符,前缀++可作为等式左值而后缀不可,因为其在CPU的实现不同,所返回的值不同

#include <stdio.h>

int main() {
    int i = 5;
    
    // 前缀++的工作原理
    // ++i 相当于:i = i + 1; 然后返回 i
    // 所以它返回的是变量i本身(左值)
    
    // 后缀++的工作原理  
    // i++ 相当于:
    // int temp = i;
    // i = i + 1;
    // return temp;
    // 所以它返回的是临时值(右值)
    
    printf("演示两者的区别:\n");
    
    int a = 5, b = 5;
    
    printf("初始: a = %d, b = %d\n", a, b);
    
    // 前缀++:先递增,再使用
    int result1 = ++a;  // a先变成6,然后result1得到6
    printf("++a: a = %d, result1 = %d\n", a, result1);
    
    // 后缀++:先使用,再递增
    int result2 = b++;  // result2先得到5,然后b变成6
    printf("b++: b = %d, result2 = %d\n", b, result2);
    
    return 0;
}

值得一提的是,C++中与C对于自增(减)运算符有不同的机制

在c++中,后缀运算的变量不可以作为左值

而前缀是可以的,会将右值赋值给变量

然而在c中,无论前缀后缀均无法作为复制对象,

二、关系运算符

关系运算符用于比较两个值的大小关系,返回结果为1(真)或0(假)

#include <stdio.h>

int main() {
    int num1 = 15, num2 = 20;
    
    // 等于
    printf("%d == %d : %d\n", num1, num2, num1 == num2);  // 0
    
    // 不等于
    printf("%d != %d : %d\n", num1, num2, num1 != num2);  // 1
    
    // 大于
    printf("%d > %d : %d\n", num1, num2, num1 > num2);    // 0
    
    // 小于
    printf("%d < %d : %d\n", num1, num2, num1 < num2);    // 1
    
    // 大于等于
    printf("%d >= %d : %d\n", num1, num2, num1 >= num2);  // 0
    
    // 小于等于
    printf("%d <= %d : %d\n", num1, num2, num1 <= num2);  // 1
    
    return 0;
}

三、逻辑运算符

仅有非!与&&或||三个

非:反转真值    与:一真则真   或:一假则假

逻辑运算具有短路求值特性,一遇到真则终止,不进行后续条件判断,且与的优先级高于或,运算时优先与或结合条件

#include <stdio.h>

int main() {
    int a = 0, b = 3, c = 2;
    
    // 包含所有运算的表达式:!a + b > c && b || c
    int result = !a + b > c && b || c;
    
    printf("表达式: !a + b > c && b || c\n");
    printf("初始值: a = %d, b = %d, c = %d\n\n", a, b, c);
    
    printf("计算步骤:\n");
    printf("1. !a    -> !%d = %d        (逻辑非)\n", a, !a);
    printf("2. %d + %d -> %d            (算术加法)\n", !a, b, !a + b);
    printf("3. %d > %d -> %d            (关系大于)\n", !a + b, c, !a + b > c);
    printf("4. %d && %d -> %d           (逻辑与)\n", !a + b > c, b, !a + b > c && b);
    printf("5. %d || %d -> %d           (逻辑或)\n", !a + b > c && b, c, result);
    
    printf("\n最终结果: %d\n", result);
    
    return 0;
}

四、三元运算符

除上述所叙运算符,C语言还有一种便利的条件运算,可以根据条件直接取不同变量值

条件 ? 表达式1 : 表达式2

若条件成立,则取表达式1的值,反之则取表达式2的

#include <stdio.h>

int main(){    
    // 判断奇偶
    int num = 15;
    char* result = (num % 2 == 0) ? "偶数" : "奇数";
    printf("%d 是 %s\n", num, result);  // 输出: 15 是 奇数
    return 0;
}

三元运算符在简易场景可以替代if-else,方便简介,但过度使用会增加可读性成本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值