一共有十五个优先级: 同一优先级的运算符,运算次序由结合方向所决定
1 () [] . -> (括号,成员排第一)
2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof (单目运算排第二)
3 * / % (乘除余三)
4 + - (加减四)
5 >> << (移位五)
6 > >= < <= (关系六)
7 == != (等于不等排第七)
8 & (位“与”)
9 ^ (”异或“)
10 | (和位"或")三分天下八九十
11 && (逻辑 ”与“)
12 || (和”或“)十一和十二
13 ?: (条件运算符)
14 = += -= *= /= %= |= ^= &= >>= <<= (条件高于赋值)
15 , (逗号优先级最低)
结合性:2 13 14 是从右至左 其他都是 从左至右有问题可以在交流的
括号成员第一; //括号运算符[]() 成员运算符. ->
全体单目第二; //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; //这个"余"是指取余运算即%
移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等
等于(与)不等排第七; //即== 和!=
位与异或和位或; //这几个都是位运算: 位与(&)异或(^)位或(|)
"三分天下"八九十;
逻辑或跟与; //逻辑运算符:|| 和 &&
十二和十一; //注意顺序:优先级(||) 底于 优先级(&&)
条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高
逗号运算级最低! //逗号运算符优先级最低
基本算术运算符:+ (加)、 - (减) 、 * (乘) 、 / (除) 和 % (求余数)
这五个运算符的优先级为:
*、/ 和%同级,但比+和-高。即先乘除后加减。
两个整数相除,结果为一整数;分子小于分母,结果为零。
例如: 5/2 结果为 2
2/5 结果为 0
这五个运算符的结合性为:自左至右。
例如:10+6- 4*2
第一步先计算10+6,得结果16,第二步计算4*2,得结果8,然后用第一步计算的结果减第二步计算的结果,得结果8。
余数计算方法:
5%3 余数是2
5%8 余数是5
-5%3 余数是 –2 (注意:符号位取<操作数1>的符号)
5%-3 余数是 2 (注意:符号位取<操作数1>的符号)
隐式转换:在编译时由编译程序按照一定规则自动完成,不需人为干预
数据参加运算前要进行下列转换:
char,short→int→float→double
混合运算时数据类型由低级→高级
unsigned → int → long → double
以上并不意味着unsigned必须到int再到long的依次转换,而是由算式中的最高级进行转换的。
复合的赋值运算符:(共十个)
+= , -= , *= , /= , %= ,
<<= , >>= , &= , ^= , |=
例如: a += 3 等价于 a=a+3
x *= y+8 等价于 x=x*(y+8)
x %= 3 等价于 x=x%3
赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子。
格式为:<变量> <赋值运算符> <表达式>
例如:int x,y,z;
x=y=z=5+6;
int x=3,y=4;
x*=y+1;
( x=等价与 x*(y+1);)
int x;
x='a';
赋值运算符结合率为:“自右而左”。
例如:a=b=c=5 a=(b=(c=5)) a,b,c值都是5
a=5+(c=6) c值为6, a值为5+6 (即11)
a=(b=4)+(c=6) b值为4,c值为6,a值为4+6 (即10)
关系运算符:关系运算符用于两个数值之间的比较运算。C语言提供6种关系运算符:
<、<=、>、>=、 优先级相同高
==、!= 优先级相同低
关系运算符的结合率为:“自左而右”。
(即当优先级相同时按自左而右结合a>b>c,当优先级不同时按优先级高低结合a=b+c)
关系运算符、算术运算符和赋值运算符的优先级为:
例如: 1、c>a+b 等效于 c>(a+b)
请写出以下三个的等效
2、a>b!=c 等效(a>b)!=c
3、a==b<c 等效a==(b<c)
4、a=b>c 等效a=b>c
关系表达式:由关系运算符和操作数组成的表达式称为关系表达式。
关系表达式的值是一个逻辑型的值,即只有两个值(真和假)。
C语言是用1作为真,用0作为假。但是进行运算时,非0即认为真,0才认为假。而表达式的结果为真时,给出真值1。为假时,给出假值0。
例1:有int x=2,y=3,z=5;
则:x>y 结果为0。
z>=y 结果为1。
z==y 结果为0。
例2: 若 a=3,b=2,c=1
f=a>b>c
得f=0
逻辑运算符:
优先级: !>&&>||
用逻辑运算符将关系表达式或逻辑量连接起来的式子。
运算结果为:“真”或“假”值。
系统在运算时以非0即为真,以0为假。
例如: 4 && 0 || 2 的值为1
5 && !0 的值为1
逻辑、关系、算术和赋值运算符的优先级为:
条件运算符:
条件表达式的一般格式为:
表达式1 ? 表达式2 : 表达式3
运算过程:表达式1的结果为真(非0)时,表达式2的计算结果作为条件表达式的值;否则,取表达式3的计算结果为条件表达式的值。
如:a>b?a:b
条件运算符的优先级低于逻辑、关系、算术运算符高于赋值运算符。
如: a>b?a:b+1 相当于 (a>b)?a:(b+1)
逗号运算符:
格式: 表达式1, 表达式2, 表达式3, LL, 表达式n
优先级: 最低
从左向右计算每个表达式的值,逗号表达式的值为表达式n的值。
例如:
y=(x=3,5+6,x+5) 逗号表达式的值为? y=8
自增、自减运算符:++ , -- (使变量的值增1或减1)
例如: ++i , --i (先自增或自减再使用)
i++ , i-- (先使用后自增或自减)
若有 int i=3,j; 则:
① j=++i; i的值为3+1 即4 , j的值为4;
② j=i++; j的值为3 , i的值为3+1=4 。
又如:i=3;
printf("%d",++i); /*输出为4*/
printf ("%d", i++); /*输出为3*/
例如:
1、z = i+++j; i = 1,j = 2则i = ?,j = ?z = ? 看成z=(i++)+j i=2 j=2 z=3
2、z = x++, y++, ++y;
x = 1, y = 1;则 x = ?,y = ?,z = ? x=2 y=3 z=1
3、j = ++i + ++i + ++i;
i = 1; j = ? j=10