操作符
- 算数操作符:+ - * / %
- 移位操作符:>> <<
- 位操作符:& | ^
- 赋值操作符:= += -= *= /= %= >>= <<=
- 单目操作符:! - + & sizeof ~ -- ++ * (类型)
- 关系操作符:> >= < <= == !=
- 逻辑操作符:&& ||
- 条件操作符(三目操作符):exp1 ? exp2 : exp3
- 逗号表达式:exp1,exp2,...,expN
- 下标引用、函数调用和结构成员:[ ] ( ) . ->
在这里先做大概的讲解,后续再做详细讲解。
单目操作符
操作符 ~
对一个数的二进制按位取反。
#include <stdio.h>
int main()
{
int a = 0;
printf("%d\n", ~a);
return 0;
}
我们已知整数在内存中的存储方式为补码
而一个数的表示方式有三种:
原码
反码
补码
对于负数的原码、反码、补码:
-1的原码:首位为符号位,1为负,0为正
1000000 00000000 00000000 00000001
-1的反码:原码符号位不变,剩下的位按位取反
11111111 11111111 11111111 11111110
-1的补码:反码加1
11111111 11111111 11111111 11111111
对于正数的原码、反码、补码:
原码、补码、反码相同。
把所有二进制位中的数字,1变成0,0变成1
a = 0 的二进制为:
00000000 00000000 00000000 00000000
按位取反后的 ~a:
11111111 11111111 11111111 11111111
我们已知 ~a 的补码,说明 ~a 是负数,则可以得到 ~a 的反码:
11111111 11111111 11111111 11111110
得到 ~a 的补码,则可以知道 ~a 的原码:
10000000 00000000 00000000 00000001
将 ~a 的原码转为十进制为:
-1
操作符 -- ++
前置 --/++:
先 --/++,后使用
#include <stdio.h>
int main()
{
int a = 10;
int b = ++a; //前置自增
printf("a = %d, b = %d\n", a, b);
b = --a; //前置自减
printf("a = %d, b = %d\n", a, b);
return 0;
}
后置 --/++:
先使用,后 --/++
#include <stdio.h>
int main()
{
int a = 10;
int b = a++; //后置自增
printf("a = %d, b = %d\n", a, b);
b = a--; //后置自减
printf("a = %d, b = %d\n", a, b);
return 0;
}
操作符 (类型)
强制类型转换
#include <stdio.h>
int main()
{
// 将浮点数 3.14 强制转换为整数并赋值给变量 a
int a = (int)3.14;
printf("%d\n", a);
return 0;
}
逻辑操作符
操作符 &&
逻辑与,并且的意思,两边都为真则结果为真,两边有一个为假则结果为假
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
int c = 0;
int d = a && b; // 3 && 4 = 1
int e = b && c; // 4 && 0 = 0
printf("d = %d\n", d);
printf("e = %d\n", e);
return 0;
}
操作符 ||
逻辑或,或者的意思,两边有一个为真则结果为真,两边全为假则结果为假
#include <stdio.h>
int main()
{
int a = 3;
int b = 0;
int c = 0;
int d = a || b;// 3 || 0 = 3
int e = b && c;// 0 && 0 = 0
printf("d = %d\n", d);
printf("e = %d\n", e);
return 0;
}
条件操作符(三目操作符):
exp1 ? exp2 : exp3
表达式1 ? 表达式2 : 表达式3
若 表达式1 成立,则整个表达式的结果为 表达式2 的结果
若 表达式1 不成立,则整个表达式的结果为 表达式3 的结果
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
int max = 0;
//常规if判断
if(a > b)
max = a;
else
max = b;
printf("两数较大的是:%d\n", max);
//表达式判断
max = a > b ? a : b;
printf("max = %d\n", max);
return 0;
}
逗号表达式
exp1,exp2,...,expN
被逗号隔开的一窜表达式,整个逗号表达式从左向右依次计算,整个逗号表达式的结果是其最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 0;
int b = 3;
int c = 5;
int d = (a = b + 2, c = a - 4, b = c + 2);
//a = 3 + 2 = 5, c = 5 - 4 = 1, b = 1 + 2 = 3, d = 3
printf("d = %d\n", d);
return 0;
}
下标引用、函数调用和结构成员
下标引用操作符 [ ]
数组访问元素时使用的 [ ] 为下标引用操作符
#include <stdio.h>
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("arr[5] = %d\n", arr[5]);//此处的 [] 是下标引用操作符
return 0;
}
函数调用操作符 ( )
调用函数的时候,函数名后面的 ( ) 就是函数调用操作符
#include <stdio.h>
int main()
{
//调用printf函数,此处的 () 为函数调用的操作符
printf("Hello, world!\n");
return 0;
}