运算符根据操作数的多少大体上可以分成三类,单目、双目以及三目,也就是说运算符的单目与双目取决于有多少个操作数。
操作数,也就是参与运算的数,比如1+1,这里面就有两个操作数,而 + 也就是双目运算符。
从功能上分类,运算符分为算数运算符,逻辑运算符,关系运算符和赋值运算符。
如下图所示,优先级可以简单记为
单目运算符>算数运算符>移位操作符>关系操作符>比较运算符>位操作符>逻辑操作符>赋值操作符
在进行复杂运算时,确定好优先级之后,根据关联规则进行求值运算。
大部分的运算顺序都是从左往右,少部分则会反过来,部分不太好记的会在实验中展示。
零碎知识整理
以下提到的知识点会在实验中进行验证。
当操作数的数据类型不同时,编译器会将占用内存小的类型转换为大的类型,比如int转换成float类型会强制转换,在要转换的操作数前面加上(要转换的类型),如:(int)1.0
强制转换会直接去掉小数点后的数字,不会四舍五入。
关系运算符得到的返回值0和1,这是因为关系运算符常用于条件判断。
唯一的三目条件运算符的格式是a1 ? a2 : a3;如果a1的值为非0值,则执行a2,为0则执行a3。
实验演示
下面代码中,第一个printf演示的是强制占内存大的数据类型转化成小的;第二个是进行默认类型转换;第三个演示了强制大转小是不遵循四舍五入的。
#include <stdio.h>
int main(void)
{
int a,b,c,d;
a = 1;
/*
a++先执行后运算
这里先执行b=a,然后执行a++
语句执行完成后,b=1,a=2
*/
b = a++;
/*
++a先运算后执行
先执行++a,后执行c=a
执行完成后,c=3,a=3
*/
c = ++a;
a += 1;
d = b < c ? a : 0;
/*
上述等价于注释代码
if(b < c)
d = a;
else
d = 0;
*/
printf("%d\n",1 + (int)3.14);
printf("%f\n",1 + 3.14);
printf("%d\n",1 + (int)0.8);
printf("a = %d\nb = %d\nc = %d\n",a,b,c);
printf("d = %d\n",d);
}