1.算数运算符
需要注意的是 求余运算,必须是int类型才可以
2.运算符的优先级和结合性
普通的数学里面是,先乘除后加减
但是如果一个表达式里面存在多种不同的运算符 , 则需要考虑运算符的优先性和结合性的问题
优先级是用来标识运算符在表达式中的运算顺序,在运算时总是先按运算符的优先级从高到低开始运算,当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序
2.1运算符及其优先关系
再详细一点,附带一个口诀。(网上找的)
全体单目第二; //所有的单目运算符比如++、 —、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; //这个”余”是指取余运算即%移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等
等于(与)不等排第七; //即== 和!=
位与异或和位或; “三分天下”八九十; //这几个都是位运算: 位与(&)异或(^)位或(|)
逻辑或跟与; //逻辑运算符:|| 和 &&
十二和十一; //注意顺序:优先级(||) 底于 优先级(&&)
条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和”,”高
逗号运算级最低! //逗号运算符优先级最低
对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。
2.2 结合性
大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。
除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符
同一优先级的看结合性,结合性一般都是从左向右的,举例,从右向左的
例如, int a,b=1,c=2; a=b=c;
a=b=c —> 赋值运算符结合性为从右向左,所以 —> a= (b=c) —> b=c=2 所以 —> a = b =2
**关于结合性,哪里不明白就用一个括号括起来就可以了,根据结合性的顺序。
一些容易出错的优先级问题
不明白的话就去编译器上代码敲出来
3.逗号表达式
逗号表达式注意两个基本知识:
- 逗号表达式的运算顺序是从左向右运算
- 逗号表达式的值取逗号中最右表达式的值
int x ,a ;
x = ((a=3*5,a*4),a+5) ;
// 最后的结果 x = 20
这个逗号表达式从左向右运算先计算a=3 5这是个赋值语句,处理a=3 5=15
再计算a 4,此时a=15,所以a 4=60,但是注意这个表达式并没有对a赋值,仅仅是一个乘法运算
根据逗号表达式的值取逗号中最右表达式的值的原则,(a=3 5,a 4)的值为60
再看a+5,
之前运算(a=3 5,a4)时,a已经被赋值为15,所以这里a+5=15+5=20
所以a+5这个表达式的值为20
再根据逗号表达式的值取逗号中最右表达式的值的原则,
表达式(a=3 5,a4),a+5 的值即为a+5的值,也就等于20了
4.关于Printf函数中的坑
printf函数在不同的环境下,运行顺序是不一样的
Windows:执行的顺序是从右到左的
int i = 1 ;
while(i <= 100)
{
// printf("%d的平方是%d\n",i-1,square(i++)) ;
printf("%d %d\n",i-1,i++) ;
}
例如上面的这个案例
那个i-1刚开始一直理解不明白,后来才发现printf中的运行顺序是从右到左的,并不是直接的理解从左到右
这点需要注意。
除了考试或者考察你的这个知识点,其余时候不会有这种错误的示范的,这种写法是不规范的
==注意==
并不是只有printf该函数是这样的,我上面没有描述清楚,