1.操作符集合
1.1运算法则
不同运算符按照彼此优先级按顺序计算,同一优先级运算符按照结合性进行运算。
2.操作符详解
在这一部分笔者将按照上图优先级来进行每一模块操作符的详细解释和演示。
2.1第一优先级
2.1.1数组下标[]
int main()
{
int a[10] = {1,2,3,4,5};
printf("%d", a[4]);
return 0;
}
如上图代码块中输出函数里面使用了数组下标,数组下标从0开始,所以据此分析,我们要输出下标为4的数组中的值即为5,来验证答案?
2.1.2圆括号()
这个操作符的用法相比作为从小学习数学的同学们不需要解释了吧,没错就是你想的那样。
2.1.3成员选择.
struct MyStruct
{
int a;
int b[5];
}myself = { 1, { 1, 2, 3, 4, 5 } };
int main()
{
printf("%d %d", myself.a, myself.b[3]);
return 0;
}
这个操作符适用于结构体类型,用法:结构体变量名.结构体成员
如上图代码块,我定义了一个包含整形变量和整形数组的结构体。输出其变量值,数组下标3处的值。
2.1.4成员选择->
struct MyStruct
{
int a;
int b[5];
}myself = { 1, { 1, 2, 3, 4, 5 } };
int main()
{
struct MyStruct*me = &myself;
printf("%d %d", me->a, me->b[3]);
printf("\n");
printf("%d %d", myself.a, myself.b[3]);
return 0;
}
这个操作符适用于结构体指针。用法:结构体指针->结构体成员,如上图对比两者结果无差别
2.2第二优先级
2.2.1负号运算符-
int main()
{
int a = 10;
printf("%d", -a);
return 0;
}
此运算符即为取负的意思,用法:-表达式
2.2.2按位取反运算符~
int main()
{
int a = 3;
printf("%d", ~a);
return 0;
}
此运算符是在计算机内对a的补码进行按位取反(因为计算机内部存储数据是以补码形式存储),再输出其取反后的原码,下图验证
2.2.3自增++和自减--运算符
int main()
{
int a = 10;
/*后置自减*/
printf("%d", a--);
printf("\n");
/*后置自加*/
printf("%d\n", a++);
/*前置自加*/
printf("%d\n", ++a);
/*前置自减*/
printf("%d", --a);
return 0;
}
自增和自减分为前置和后置,前置是先运算再使用变量,后置是先使用变量再计算
![](https://img-blog.csdnimg.cn/5d03e6ba38894f85929c589c437e20ad.png)
2.2.4取值运算符和取地址运算符
int main()
{
struct MyStruct*me = &myself;
printf("%d", *me->b);
}
取值运算符(解引用运算符)用法:*指针变量
取地址运算符用法:&变量名,取出地址
2.2.5 逻辑非运算符、长度运算符、强制类型转换运算符
int main()
{
int a = 0;
int arr[5] = { 1, 2, 3, 4, 5 };
if (!a)
printf("%d\n", sizeof(arr));
printf("%f", (float)a);
return 0;
}
逻辑非运算符!:对非零数变为0,对零则变为1
长度运算符sizeof():求变量所占字节
强制类型转换(类型):将原类型转为另一类型
2.3第三优先级
2.3.1乘*、除/、取模%(求余)
这个我觉得大家作为从小就学数学的不陌生吧,应该已经刻入骨髓了
2.4第四优先级
2.4.1加、减
这个不也是我们所熟悉的四则运算吗?
2.5第五优先级
2.5.1左移<<和右移>>
int main()
{
int a = 2;
printf("%d\n", a<< 1);
printf("%d\n", a>> 2);
return 0;
}
左移用法:变量<<表达式,右移同理。注:都是对补码操作
2.6第六优先级
2.6.1 >=,<=,<,>, ==,!=
这块不也和我们从小学的数学运算法则有关吗?同理
2.7第七优先级
2.7.1按位与,按位或,按位异或
int main()
{
int a = -3, b = -1;
printf("%d\n", a&b);
printf("%d\n", a|b);
printf("%d\n", a^b);
return 0;
}
对补码进行运算,按位与:同1则1,有0则0;按位或:有1则1,同0则0;按位异或:相同为0,相异为1
2.8第八优先级
2.8.1逻辑与,逻辑或
int main()
{
int a = 10, b = 0;
printf("%d\n", a&&b);
printf("%d", a||b);
return 0;
}
在逻辑中非零值和零相与则为0;相或则为1
2.9第九优先级
2.9.1条件运算符
int main()
{
int a = 10;
printf("%d", a == 9 ? 10 : 8);
return 0;
}
条件运算符:表达式1?表达式2;表达式3
若1成立,则2执行。否则3执行
2.10第十优先级
2.10.1赋值运算符
“+=、-=、*=、/=.....”诸如此类俱为赋值运算符,在进行运算后将值赋给原变量
2.10.2逗号运算符
表达式1,表达式2,表达式3......,执行所有表达式,但只输出末尾表达式