操作符
算术操作符
移位操作符 (是移动二进制位)
a是整型,32bit。
所以12二进制是 00000000000000000000000000001100
向左一位 00000000000000000000000000011000(C语言规定末位补0)
二进制11000转化后为24
位操作符
& 按(二进制)位与 对应的二进制有0就为0
^ 按(二进制)位或 对应的二进制有1就为1
| 按(二进制)位异或 对应的二进制相同就为0,相异则为1
int main()
{
int a = 3;
int b = 5;
int c = a & b;
return 0;
}
3的二进制00000000000000000000000000000011
5的二进制00000000000000000000000000000101
得出是00000000000000000000000000000001
赋值操作符
赋值
int a = 10;//创建一个变量同时给一个值,是初始化
float b = 0.0;
a = 20;//有了变量之后再给他一个值,是赋值
b = 9.95;//直接写出的浮点数默认是double类型
//9.95f-指定是float类型
复合赋值
int a = 0;
a = a + 5;
a += 5;//这俩个是一个意思
单目操作符(只有一个操作数的操作符)
3 + 5;//左右都有操作数,+是双目操作符
int a = 2;//0为假,非0为真 a是真的
int b = 3;//为真
if (a)//a为真,打印love
{
printf("love");
}
if (!b)//!b为假,不打印love
{
printf("love");
}
~ 按(二进制)位取反 (二进制位是1就取0,是0就取1)
整数在内存中存放的是二进制的补码,整数二进制的表达方式有三种
原码:直接按照数字的正负转换的二进制
(对于有符号数,二进制最高位是符号位。最高位是0,表示正数;最高位是1,表示负数)
反码:原码的符号位不变,其他位按位取反
补码:反码加1(末位加1)
正整数的原码 反码 补码相同。 负整数的原码 反码 补码需要计算
int a = 0;//整数在内存中存放的是二进制的补码
//00000000000000000000000000000000 - 补码
//11111111111111111111111111111111 - ~a 取反后的结果仍为补码
//打印出来的是原码,所以要从补码变回原码(减一后按位取反)
//10000000000000000000000000000001 - 原码
printf("%d",~a);//打印出来为-1
++ - - 前置后置
int a = 10;
int b = a++;//后置++,b先使用,a再++(加一)
printf("%d",a);//a是11
printf("%d",b);//b是10
int c = 10;
int d = ++c;//前置++,c先++,d再使用
printf("%d",c);//c是11
printf("%d",d);//d是11
( ) 强制类型转换
int a = (int)3.14//3.14是double类型加上(int)可以强制转换
printf("%d",a);//打印出来是3
关系操作符
逻辑操作符
&& 并且,俩个条件都要满足
|| 或,有一个满足就行
if(a > 20) && (b > 22)
{
printf("haha");
}
条件操作符(三目操作符)
exp1为真,则表达式的结果是exp2的结果;
exp1为假,则表达式的结果是exp3的结果.
int a = 2;
int b = 1;
int c = 0;
c = (a > b) ? (a) : (b);
printf("%d",c);//打印出来为2
逗号表达式
从左向右依次计算,整个表达式的结果是最后一个表达式的结果,即expN的结果
下标引用、函数调用和结构成员
arr [4] //[]的操作数是arr和4
void test();//viod是无,表示test函数调用完之后什么都不返回
{
printf("ha");
}
int main()
{
int a = 0;
printf("%d",a);
test();//()这里表示test函数被调用,操作数是test
return 0;
}