一、算数运算符
#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,方便简介,但过度使用会增加可读性成本
2万+

被折叠的 条评论
为什么被折叠?



