算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。
例:5 + 3 = 8 ,10 - 3 = 7 ,3 * 8 = 24 ,15 / 5 = 3 ,15 % 4 = 3
自增:前自增(++i): 先执行自增操作,再进行其他操作
后自增(i++): 先进行其他操作,再执行自增操作
int i = 5;
printf("%d\n", ++i); // 输出6
printf("%d\n", i++); // 输出6,但i的值变为7
自减:同上
关系运算符
用于比较运算,返回true 或 false。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
int a = 5;
int b = 3;
printf("%d\n", a == b); // 0(false)
printf("%d\n", a != b); // 1(true)
printf("%d\n", a > b); // 1
printf("%d\n", a < b); // 0
printf("%d\n", a >= b); // 1
printf("%d\n", a <= b); // 0
逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
&&:用于连接两个表达式,只有当两个表达式都为真时,整个表达式才为真。
if ( (5 > 3) && (2 < 4) )
{
putchar(0x55);
}
||:用于连接两个表达式,只要其中一个表达式为真,整个表达式就为真。
if ( (5 > 3) || (6 < 4) )
{
putchar(0x55);
}
!:用于反转一个表达式的逻辑值。如果表达式为真,!运算符将其变为假,反之亦然。
if (!(i > 100))
{
putchar(0x55);
}
位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
位与(&):两个数的二进制同时为1,结果才为1,否则为0
例:5 & 3
0101
0011
----------
0001 1
位或(|):两个数的二进制有一个为1,结果就为1
例:5 | 3
0101
0011
----------
0111 7
位非(~):对操作数的每一位执行逻辑非运算,将 0 变为 1,1 变为 0。
例:~5
0101
----------
1010 -6(二进制补码: 1010)
位异或(^):判断两个对应位是否不同,若不同则结果为 1,相同则为 0。
例:5 ^ 3
0101
0011
----------
0110 6
左移(<<):将操作数的所有二进制位向左移动指定的位数,右边空出的位用 0 填充。
例:5 << 2
0000 0101 << 0001 0100 20
右移(>>):将操作数的所有二进制位向右移动指定的位数,左边空出的位根据操作数的类型填充(正数补 0,负数补符号位)。
例:20 >> 2
0001 0100 >> 0000 0101 5
赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
例:复合算术赋值
x = 10
x += 5 // x = x + 5,结果x为15
x -= 3 // x = x - 3,结果x为12
x *= 2 // x = x * 2,结果x为24
x /= 4 // x = x / 4,结果x为6.0
x %= 5 // x = x % 5,结果x为1.0
复合位运算赋值
y = 10 二进制: 1010
y &= 6 // y = y & 6 (0110),结果y为2 (0010)
y |= 8 // y = y | 8 (1000),结果y为10 (1010)
y ^= 5 // y = y ^ 5 (0101),结果y为15 (1111)
y <<= 2 // y = y << 2,结果y为60 (111100)
y >>= 3 // y = y >> 3,结果y为7 (00111)
条件运算符
是一个三目运算符,用于条件求值(?😃,是C语言中唯一需要三个操作数的运算符,用于在一行代码中实现条件判断并返回结果,常用于替代简单的if-else语句。
例:
(a > b) ? a : b // 如果 a 大于 b,则表达式的值为 a,否则为 b
逗号运算符
用于把若干表达式组合成一个表达式(,),允许在一个表达式中按顺序执行多个操作,并返回最后一个操作的值。
例:
int a = 1, b = 2, c;
c = (a + 1, b + 2); // c 的值为 4,因为 b + 2 是最后一个表达式
指针运算符
用于取内容(*)和取地址(&)二种运算。
例:取地址运算符:&
int num = 10;
int* ptr = # // ptr存储num的内存地址
printf("num的地址:%p\n", (void*)ptr); // 输出num的内存地址
解引用运算符:*
int num = 10;
int* ptr = #
*ptr = 20; // 通过指针修改num的值,此时num变为20
printf("num的值:%d\n", num); // 输出20
求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
例:
int main()
{
printf("char: %zu 字节\n", sizeof(char)); // 通常为1
printf("int: %zu 字节\n", sizeof(int)); // 通常为4
printf("float: %zu 字节\n", sizeof(float)); // 通常为4
printf("double: %zu 字节\n", sizeof(double)); // 通常为8
printf("long long: %zu 字节\n", sizeof(long long)); // 通常为8
return 0;
}
特殊运算符
包括括号(),下标[],成员(->,.)等几种。
括号():控制优先级、函数调用、类型转换、分组
例:控制优先级
int a = 2 + 3 * 4; // a = 14
int b = (2 + 3) * 4; // b = 20
函数调用
int result = max(5, 10); // 调用max函数
类型转换
double pi = 3.14159; // 定义double类型变量pi,赋值为3.14159
int int_pi = (int)pi; // 将pi强制转换为int整数类型,结果赋值给int_pi为3
分组
int c = ((a > b) ? a : b) + 1;
下标[]:数组元素访问、指针指向元素访问
例:数组元素访问
int arr[5] = {10, 20, 30, 40, 50};
printf("%d\n", arr[2]); // 输出 30
指针指向元素访问
int *ptr = arr; // ptr 指向 arr 的首元素
printf("%d\n", ptr[1]); // 输出 20
成员(->,.):直接成员访问符(.) 和间接成员访问符(->)
直接成员访问符(.):点运算符用于访问实际对象的成员。如果你有一个结构体实例,你可以使用点运算符来访问其成员。
例:
struct Employee
{
char first_name[16]; // 存储员工名字的字符数组(最多15个字符+终止符)
int age; // 存储员工年龄的整数
} emp; // 声明一个Employee类型的变量emp
strcpy(p_emp->first_name, "zara"); // 把值 "zara" 赋给对象 emp 的 first_name 成员。
间接成员访问符(->):通过指针访问结构的成员
strcpy(p_emp->first_name, "zara"); // p_emp 是一个指针,指向类型为 Employee 的对象,把值"zara" 赋给对象 emp 的 first_name 成员