操作符
·算术操作符
+ - * / %
%(取模):
int main()
{
int a = 5%2;//%取模-5/2得到余数
printf("%d\n", a);
return 0;
//输出余数1
}// 补充如果是5/2会输出2
·移位(二进制)操作符
//<<左移操作符
//>>右移操作符
int main()
{
int a = 1;
//整型1占了4个字节=32bit位
//0000000000 0000000000 0000000000 01(1的二进制表示为01)
int b = a << 1;//
//b = a+1;//a+1的结果赋给了b(a没有发生改变)
printf("%d\n", b);//输出2
printf("%d\n", a);//测试a是否有变化,在对a进行左移或右移操作时a始终不变(除非移动结束后赋给a本身会发生改变)
return 0;
}
·位(二进制位)操作符
C语音中:二进制0代表假,1代表真
分类:
·& 按位与
·| 按位或
· ^ 按位异或
//按位与案例:
int main()
{
int a = 3;//写出a=3的二进制位011
int b = 5;//写出b=5的二进制位101
//例:进制转换(二进制:1 1 1 1 )
// 1*2^3 1*2^2 1*2^1 1*2^0
int c = a & b;//按二进制的位进行与(与就是并且的意思)
//按位与并且关系下011
// 101
//得出结果 001(只有在同时为真时会产生真)
printf("%d\n", c);
return 0;
}//按位与后产生结果为001换算成十进制整型结果为1
//按位或案例:
int main()
{
int a = 3;//写出a=3的二进制位011
int b = 5;//写出b=5的二进制位101
int c = a | b;//按二进制的位进行或(或就是或者的意思)
//按位或或者关系下011
// 101
//得出结果 111(只要有一个为真即可)
printf("%d\n", c);
return 0;
}//按位或后产生结果为111换算成十进制整型结果为7
//按位异或案例:
//注意:在C语音中^符号不是次方而是 异或 的意思!
//异或的计算规律:
//对应的二进制位相同则为0(假)
//对应的二进制位相异则为1(真)
int main()
{
int a = 3;
int b = 5;
int c = a ^ b;//按二进制的位进行异或(上方有详细解释)
//按位异或关系下011
// 101
//得出结果 110(相同为真,相异为假)
printf("%d\n", c);
return 0;
}//按位异或后产生结果为110换算成十进制整型结果为6
·赋值操作符
= += -= *= /= &= ^= |= >>= <<=
以上为复合赋值符
int main()
{
int a = 10;//=是赋值的意思(==是判断相等的意思)
a = a + 10;//第一种写法:a+10后赋值给a
a += 10;//第二种写法:给a自己加上10
a = a - 20;//第一种写法:a-20后赋值给a
a -= 20;//第二种写法:给a自己减去20
a = a & 2;//第一种写法:a按位与2后赋值给a
a &= 2;//第二种写法:给a自己安慰与2
return 0;
}
·单目操作符
-双目操作符
-三目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
int main()
{
int a = 10;
int b = 20;
a + b;//+是一个双目操作符(他有两个需要操作的数)同理可推导出单目操作符和三目操作符的意义
return 0;
}
!-逻辑反操作
int main()
{
//C语言中我们表示真假
//0-假
//非0-真
int a = 10;
printf("%d\n", a);//正常输出为10
printf("%d\n", !a);//a为10是真,!a是逻辑反操作符,操作后输出为假-0
//特殊情况
int a = 0;
printf("%d\n", a);//正常输出为10
printf("%d\n", !a);//a为0是假,!a是逻辑反操作符,操作后输出为固定值1
return 0;
}
- 负值
int main()
{
int a = -2;//-为单目操作符
int b = -a;//对a进行取负
int c = +3;//通常情况下+没有价值会省略
return 0;
}
sizeof 操作数的类型长度(以字节为单位)
//sizeof 计算变量大小:
int main()
{
int a = 10;
//sizeof计算的是变量/或者类型所占空间的大小,单位是字节
printf("%d\n", sizeof(a));//4个字节
printf("%d\n", sizeof(int));//4个字节
printf("%d\n", sizeof a);//4个字节(求变量大小时可以省略括号)
//printf("%d\n", sizeof int);//4个字节 (无法省略括号)
return 0;
}
//sizeof 计算数组大小:
int main()
{
int arr[10] = {0};//10个整型元素的数组
//sizeof(int)为4个字节所以可得:10*sizeof(int)=40
int sz = 0;
printf("%d\n", sizeof (arr));//计算arr数组的大小,占用40个字节
//计算一下数组的元素个数
//个数=数组总大小/每个元素的大小
sz = sizeof(arr) / sizeof(arr[0]);
printf("sz=%d\n", sz);
return 0;
}
~ 对一个数的二进制按位取反
//举例: 0101
//按位去取反后对应1010
int main()
{
int a = 0;//整型a占用4个字节,32bit位
//0000000 0000000 0000000 0000000
int b = ~a;//b是有符号的整型
//按位取反对应11111111 11111111 11111111 11111111
//原码、反码、补码
//原码->反码->补码 的过程为:
//原码到反码符号位不变,其他位按位取反得到反码,反码加1得到补码(可反推)
//例:11111111 11111111 11111111 11111111(补码)
//得:11111111 11111111 11111111 11111110(反码)->1000000 0000000 0000000 0000001(原码)
//负数在内存中存储的时候,存储的是二进制的补码
printf("%d\n",b);//输出的是这个数的原码
return 0;
}
--前置、后置--
++前置、后置++
int main()//后置++
{
int a = 10;
int b = a++;//后置++,先使用,再++
printf("a=%d b=%d\n", a, b);//输出:a=11,b=10
return 0;
}
int main()//前置++
{
int a = 10;
int b = ++a;//前置++,先++,再使用
printf("a=%d b=%d\n", a, b);//输出:a=11,b=11
return 0;
}
int main()//后置--
{
int a = 10;
int b = a--;//后置--,先使用,再--
printf("a=%d b=%d\n", a, b);//输出:a=9,b=10
return 0;
}
int main()//前置--
{
int a = 10;
int b = --a;//前置--,先--,再使用
printf("a=%d b=%d\n", a, b);//输出:a=9,b=9
return 0;
}
(类型) 强制类型转换:
int main()
{
int a = (int)3.14;//double-->int
return 0;
}
不建议强制类型转换!
·关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”(=是赋值操作符)
·逻辑操作符
&& 逻辑与(并且)
int main()//&&逻辑与
{
int a = 3;//a非0为真
int b = 5;//b非0为真
int c = a && b;//&&并且关系
printf("c=%d\n", c);//c为真,输出1
return 0;
}
int main()//&&逻辑与
{
int a = 0;//a为0为假
int b = 5;//b非0为真
int c = a && b;//&&并且关系
printf("c=%d\n", c);//c为假,输出0(只要有一个为假,即输出假0)
return 0;
}
|| 逻辑或(只要一个成功即为真)
int main()//||逻辑或
{
int a = 0;//a为0为假
int b = 5;//b非0为真
int c = a || b;//||只要有一个为真,即c为真
printf("c=%d\n", c);//c为真,输出1
return 0;
}
int main()//||逻辑或
{
int a = 0;//a为0为假
int b = 0;//b为0为假
int c = a || b;//||只要有一个为真,即c为真
printf("c=%d\n", c);//c为假,输出0
return 0;
}
int main()//||逻辑或
{
int a = 3;//a为3为真
int b = 5;//b为5为真
int c = a || b;//||只要有一个为真,即c为真
printf("c=%d\n", c);//c为真,输出1
return 0;
}
·条件操作符
exp1 ? exp2 : exp3(三目操作符)
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = (a > b ? a : b);//条件操作符
//a>b 为真则输出a的值,a>b为假则输出b的值
//a=10,b=20,a比b小所以输出b的值为20
if (a > b)
max = a;
else
max = b;
return 0;
}
·逗号表达式
exp1, exp2, exp3, …expN
·下标引用、函数调用和结构成员
[] () . ->