运算符分类
总体可以认为运算符分为以下几类:算术运算符、关系运算符、逻辑运算符、其余运算符,运算符的样子长下面这样:
其中着重号标注的需要熟练掌握用法。
算术运算符(+ \- * / %)
关系运算符(> < == >= <= !=)
逻辑运算符(! && ||)
- 位运算(<< >> ~ | ^ &)
赋值运算符(=及扩展运算符又称复合运算符)
- 条件运算符(又称三目运算符 xxx?x1:x1)
- 逗号运算符(,) 外部这个括号是必须的
- 指针运算符 * &
求字节运算符 sizeof
强制类型转换运算符 (类型)xxx
- 分量运算符(又称成员运算符) -> .
- 下标运算符 []
- 其他 函数调用运算符 ()
看完运算符分类,下面是运算符使用时需要注意的一些点。
1.算术运算符
可以进行加、减、乘、除、取余运算,使用方法与数学中无异。
值得注意的是:
- 除法运算符在使用的时候如果除数与被除数均是整数那么整除后的结果会向下取整。
- 取余时余数的正负号只与被除数有关(可以由以下代码验证)
#include"stdio.h"
int main()
{
//%的运算对象只能是整数
printf("%d\n", 7 % 3);//输出结果为1
printf("%d\n", 7 % -3);//输出结果为1
printf("%d\n", -7 % 3);//输出结果为-1
printf("%d\n", -7 % -3);//输出结果为-1
//a%b余数的正负号只与a的正负有关
return 0;
}
通常加减乘除运算会与其余运算符一块使用,每一个算术运算表达式都最终都可以化为一个值。
2.关系运算符
关系表达式的值只有真或假,由于C语言中没有布尔类型
,通常会使用0代表假、非零代表真即非零即一
,关系运算符的优先级小于算术运算符的优先级。在使用关系运算符时需要严格注意==不要写成=,大于小于不要写成<<>>。下面两个例子就是反例:
- 把==写成=(条件会出错)
#include"stdio.h"
int main()
{
int i;
//%的运算对象只能是整数
printf("%d",i=2);
//a%b余数的正负号只与a的正负有关
return 0;
}
结果:
与变量的值有关
- 判断时==连写例如5==5==5 或者 把a大于3小于5写成3<a<5
#include <stdio.h>
int main() {
printf("5==5==5 result:%d\n",5==5==5);
printf("5<10<5 result:%d",5<10<5);
return 0;
}
结果:
5==5==5 result:0
5<10<5 result:1
3.逻辑运算符与逻辑表达式
这里值得注意的是逻辑非的运算级最高,逻辑或与逻辑与相同优先级但低于关系运算符,逻辑表达式与关系表达式一样,结果只有真或假,逻辑表达式通常写进分支语句或者循环语句中。逻辑运算符有一个特性:短路机制。
规则如下:
- 或运算时前置项为真时发生短路,逻辑表达式直接为真
- 且运算时前置项为假时发生短路,逻辑表达式直接为假
示例:可以看出下面代码并没有执行打印操作
#include <stdio.h>
int main() {
int i=0;
i&&printf("5==5==5 result:%d\n",5==5==5);
return 0;
}
4.其余运算符
这里着重说一下赋值运算符与sizeof运算符。其余的运算符后面会说到
- 赋值运算符
赋值运算符是未来我们写代码的时候最常用的运算符之一,赋值运算符的左端必须是左值,也就是有内存地址的变量,不可以是右值也就是常量,否则会引发编译错误。除此之外赋值运算符还包含符合赋值运算符 += -= *= /=这些运算符也是算术运算符的一种简写方式,可以提高阅读代码与程序执行的效率。 - sizeof运算符,这个其实是一个运算符并不是一个函数。
运算符的优先级
可以参考以下一个图表。
注意:同一优先级运算符,运算次序由结合方向决定。不同级别优先级遵循以下规则:!>算术运算符>关系运算符>&&>||>赋值运算符。