1、算术运算符:
测试代码1:
#include <stdio.h>
int main() {
char c = 'A'; // ASCII 值为 65
int i = 10;
float f = 3.14;
double d = c + i + f; // c 被提升为 int,然后与 i 相加,结果再与 f 相加(f 被提升为 double)
printf("d = %f\n", d); // 输出 d 的值,d 是 double 类型
int result = (int)d; // 显式地将 double 类型的 d 转换为 int 类型的 result
printf("result = %d\n", result); // 输出 result 的值,会发生精度丢失
return 0;
}
运行结果如下:
测试代码2:
#include <stdio.h>
#include <cmath>
int main() {
// int 类型
int intA = 10, intB = 5;
printf("int 加法: %d + %d = %d\n", intA, intB, intA + intB);
printf("int 减法: %d - %d = %d\n", intA, intB, intA - intB);
printf("int 乘法: %d * %d = %d\n", intA, intB, intA * intB);
printf("int 除法: %d / %d = %d\n", intA, intB, intA / intB); // 结果是整数
printf("int 取余: %d %% %d = %d\n", intA, intB, intA % intB);
// float 类型
float floatA = 10.5f, floatB = 4.2f;
printf("float 加法: %.2f + %.2f = %.2f\n", floatA, floatB, floatA + floatB);
printf("float 减法: %.2f - %.2f = %.2f\n", floatA, floatB, floatA - floatB);
printf("float 乘法: %.2f * %.2f = %.2f\n", floatA, floatB, floatA * floatB);
printf("float 除法: %.2f / %.2f = %.2f\n", floatA, floatB, floatA / floatB);
// float 类型没有直接的取余运算符,但以通过转换为整数或使用fmod函数
printf("float 取余(使用fmod): %.2f %% %.2f = %.2f\n", floatA, floatB, fmod(floatA, floatB));
// double 类型
double doubleA = 10.5, doubleB = 4.2;
printf("double 加法: %.2f + %.2f = %.2f\n", doubleA, doubleB, doubleA + doubleB);
printf("double 减法: %.2f - %.2f = %.2f\n", doubleA, doubleB, doubleA - doubleB);
printf("double 乘法: %.2f * %.2f = %.2f\n", doubleA, doubleB, doubleA * doubleB);
printf("double 除法: %.2f / %.2f = %.2f\n", doubleA, doubleB, doubleA / doubleB);
// double 类型同样没有直接的取余运算符,可以使用fmod函数
printf("double 取余(使用fmod): %.2f %% %.2f = %.2f\n", doubleA, doubleB, fmod(doubleA, doubleB));
return 0;
}
运行结果如下:
...........................................................................................................................................................
2、关系运算符:
C语言中的关系运算符用于比较两个值之间的关系,并根据比较的结果返回真(非零值,通常是1)或假(零)。在条件判断、循环控制等场景中非常有用。C语言中的关系运算符包括:
等于(==):用于比较两个值是否相等。如果相等,结果为真(1);否则为假(0)。
不等于(!=):用于比较两个值是否不相等。如果不相等,结果为真(1);否则为假(0)。
大于(>):用于比较左侧值是否大于右侧值。如果是,结果为真(1);否则为假(0)。
小于(<):用于比较左侧值是否小于右侧值。如果是,结果为真(1);否则为假(0)。
大于等于(>=):用于比较左侧值是否大于或等于右侧值。如果是,结果为真(1);否则为假(0)。
小于等于(<=):用于比较左侧值是否小于或等于右侧值。如果是,结果为真(1);否则为假(0)。
关系运算符主要用于条件语句(如if语句)中,以及循环语句(如while、for)的条件表达式中,以控制程序的流程。
#include <stdio.h>
int main() {
int num1 = 10;
int num2 = 20;
// 等于(==)
if (num1 == num2) {
printf("%d is equal to %d\n", num1, num2);
} else {
printf("%d is not equal to %d\n", num1, num2);
}
// 不等于(!=)
if (num1 != num2) {
printf("%d is not equal to %d\n", num1, num2);
}
// 大于(>)
if (num1 > num2) {
printf("%d is greater than %d\n", num1, num2);
} else {
printf("%d is not greater than %d\n", num1, num2);
}
// 小于(<)
if (num1 < num2) {
printf("%d is less than %d\n", num1, num2);
} else {
printf("%d is not less than %d\n", num1, num2);
}
// 大于等于(>=)
if (num1 >= num2) {
printf("%d is greater than or equal to %d\n", num1, num2); // 不会打印,因为num1 < num2
} else {
printf("%d is not greater than or equal to %d\n", num1, num2);
}
// 小于等于(<=)
if (num1 <= num2) {
printf("%d is less than or equal to %d\n", num1, num2);
} else {
printf("%d is not less than or equal to %d\n", num1, num2);
}
return 0;
}
运行结果如下:
...........................................................................................................................................................
3、逻辑运算符:
C语言中的逻辑运算符用于根据两个或多个表达式的值来返回真(非零)或假(零)。通常用于条件语句中,控制程序的流程。三种基本的逻辑运算符:逻辑与(AND)、逻辑或(OR)和逻辑非(NOT)。
逻辑非(!):一元运算符,用于对其后的表达式的值取反。如果表达式的值为真(非零),则逻辑非运算符返回假(0);如果表达式的值为假(0),则返回真(1)。
逻辑与(&&):二元运算符,用于判断其两个操作数是否都为真。只有当两个操作数都为真时,结果才为真(1);否则为假(0)。
逻辑或(||):二元运算符,用于判断其两个操作数中是否至少有一个为真。如果两个操作数中至少有一个为真,则结果为真(1);只有当两个操作数都为假时,结果才为假(0)。
逻辑运算符的短路行为:
逻辑与(&&):如果第一个操作数为假(0),则整个表达式的值就已经确定为假,此时不会评估第二个操作数,称为“短路”。
逻辑或(||):如果第一个操作数为真(非零),则整个表达式的值就已经确定为真,此时不会评估第二个操作数,同样称“短路”。
测试代码1:
#include <stdio.h>
int main() {
int a = 5, b = 10, c = 15;
if (a > b && c > b) {
printf("Both conditions are true\n");
} else {
printf("At least one condition is false\n"); // a > b 假
}
if (a < b || c < b) {
printf("At least one condition is true\n"); // a < b 真
}
if (!(a == b)) {
printf("a is not equal to b\n"); // !(a == b) 真
}
return 0;
}
运行结果如下:
测试代码2:
#include <stdio.h>
#include <stdbool.h>
// 逻辑非(NOT)
bool logicalNot(int value) {
return !value;
}
// 逻辑与(AND)
bool logicalAnd(int a, int b) {
return a && b;
}
// 逻辑或(OR)
bool logicalOr(int a, int b) {
return a || b;
}
// float和char类型的包装函数,内部转换为int处理
bool logicalAndFloat(float a, float b) {
return logicalAnd((int)a, (int)b);
}
bool logicalOrChar(char a, char b) {
return logicalOr((int)a, (int)b); // 字符被隐式转换为ASCII值
}
int main() {
int intA = 0, intB = 5;
float floatA = 0.0f, floatB = 5.0f;
char charA = 'A', charB = '5'; // 使用字符的ASCII值进行比较
printf("logicalNot(intA): %d\n", logicalNot(intA));
printf("logicalAnd(intA, intB): %d\n", logicalAnd(intA, intB));
printf("logicalOr(intA, intB): %d\n", logicalOr(intA, intB));
printf("logicalAndFloat(floatA, floatB): %d\n", logicalAndFloat(floatA, floatB));
printf("logicalOrChar(charA, charB): %d\n", logicalOrChar(charA, charB));
return 0;
}
运行结果如下:
.......................................................................................................................................................
4、位运算符:
位运算符对整数类型的位模式进行操作。在底层编程、硬件接口、图形处理、加密算法等领域非常有用。常用的位运算符及其说明:
按位与(AND)运算符 &
对两个数的二进制表示进行逐位与操作。只有当两个相应的位都为1时,结果位才为1,否则为0。
按位或(OR)运算符 |
对两个数的二进制表示进行逐位或操作。只要两个相应的位中有一个为1,结果位就为1。
按位异或(XOR)运算符 ^
对两个数的二进制表示进行逐位异或操作。当两个相应的位不相同时,结果位为1;相同时,结果位为0。
按位取反(NOT)运算符 ~
对一个数的二进制表示进行逐位取反操作。即0变为1,1变为0。
结果通常是一个补码表示的数,直接用于正数时,结果将是负数。
左移(Shift Left)运算符 <<
将一个数的二进制表示向左移动指定的位数,右边超出的位被丢弃,左边超出的部分用0填充。
右移(Shift Right)运算符 >>
将一个数的二进制表示向右移动指定的位数。对于有符号整数,左边超出的部分用符号位填充(即算术右移);
对于无符号整数,左边超出的部分用0填充(即逻辑右移)。无符号整数和有符号整数的右移操作,其行为可能有所不同,取决于编译器和平台。
测试代码:
#include <stdio.h>
int main() {
// 按位与(AND)运算符 &
unsigned int a1 = 12; // 0000 1100
unsigned int b1 = 9; // 0000 1001
unsigned int c1 = a1 & b1;
printf("%u & %u = %u\n", a1, b1, c1);
// 按位或(OR)运算符 |
unsigned int a2 = 12; // 0000 1100
unsigned int b2 = 9; // 0000 1001
unsigned int c2 = a2 | b2;
printf("%u | %u = %u\n", a2, b2, c2);
// 按位异或(XOR)运算符 ^
unsigned int a3 = 12; // 0000 1100
unsigned int b3 = 9; // 0000 1001
unsigned int c3 = a3 ^ b3;
printf("%u ^ %u = %u\n", a3, b3, c3);
// 按位取反(NOT)运算符 ~
// 按位取反的结果通常用十六进制或二进制表示
unsigned int a4 = 12;
unsigned int c4 = ~a4;
printf("~%X = %X\n", a4, c4);
// 左移(Shift Left)运算符 <<
unsigned int a5 = 4; // 0000 0100
unsigned int c5 = a5 << 2;
printf("%u << 2 = %u\n", a5, c5);
// 右移(Shift Right)运算符 >>
// 无符号整数,右移
unsigned int a6 = 16; // 0001 0000
unsigned int c6 = a6 >> 2;
printf("%u >> 2 = %u\n", a6, c6);
// 有符号整数右移动
int num = -4; // -4的二进制表示为 11111111 11111111 11111111 11111100 (32位)
int shifted = num >> 1;
// 打印结果
printf("Original: %d\n", num);
printf("Shifted : %d\n", shifted);
return 0;
}
运行结果如下: