目录:
一.运算符
二.运算符的结合性
三.简单赋值运算
四.复合赋值运算
五.基本的算术运算
六.自增、自减算术运算
七.算术表达式
八.逗号运算
一.运算符
二.运算符的结合性
所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
自左至右的结合方向,称为左结合性。
反之,称为右结合性。
除单目运算符、赋值运算符、条件运算符是右结合性外,其它运算符都是左结合性。
三.简单赋值运算
- 运算符:=
- 用法:变量=数据
- 作用:将一个数据赋给一个变量
- 结合方向:自右向左
- 优先级:比算术运算符低,仅高于逗号运算符
数据:常量、变量或表达式
变量:只能是变量,不能是常量或表达式
例:
5=x-5*y❌ 错误原因:常量被赋值
a+b=666❌ 错误原因:表达式被赋值
ps:
- 赋值运算符“=”不同于数学中的等号,它没有相等的含义,双等于号“==”才表示C语言中的相等。
- 赋值运算符要求左右操作数的类型最好一致,至少要兼容。
- 如果左右操作数的类型不同但兼容,系统自动完成类型的转换,转换的原则是运算符右边的数据类型转换为左边的变量类型。
ps:意外结果的产生原因,在隐式类型转换那篇已经详细讲解。
四.复合赋值运算
赋值运算符前面加上其它运算符,如
ps:复合赋值运算符的优先级与赋值运算符的优先级相同,且结合方向也一致。而且,复合赋值运算符右边的表达式是一个运算整体,不能把它分开。
a+=3 ☞ a=a+3
x*=y+8 ☞ x=x*(y+8)
构成复合赋值运算符的两个符号之间不能有空格。
五.基本的算术运算
- “/”运算符若两边的操作数为整数,则相除的结果仍为整数。
如:3/2的结果值为1,舍去小数部分。
- 除数、被除数有一个为实数,结果为实型。
如:3.0/2的结果为1.5。
- 如果除数或被除数中有一个为负值,舍入方向不固定。
如:-5/3,有的系统中得到的结果为-1,而有的系统得到结果为-2。
VS 2010采取“向零取整”的方法。5/-3=-1,-5/3=-1,取整后向零靠拢
- % 运算符,要求两个操作数均为整型,其结果为两数相除所得的余数。
如:5%3,结果为2。
- 如果%运算符两边操作数有负值,其结果的符号由被除数决定。
如:-11%4结果为-3,11%-4结果为3,-11%-4的结果为-3。
六.自增、自减算术运算
x=++i;
先执行i+1,再使用i值,即使用的是增1后的值。
相当于以下两个语句的运算结果:i=i+1;x=i;
x=i++;
先使用i值,再执行i+1,即使用的是增1前的值。
相当于以下两个语句的运算结果:x=i;i=i+1;
如果前置或后置作为一个单独的语句出现,并没有什么区别。如果用在别的语句中,后置运算会先让变量参与别的运算,最后自才自增或自减。
ps:
- 自增与自减运算符不能用于常量或表达式。
如:--2,(a+b)++等都是非法的。
- 自增与自减运算符常用于整型变量,也可以用于字符型变量以及实型变量。
同时,我们也要尽量避免嵌套使用。因为在不同的编译器可能出现不同的结果。这种垃圾代码就应该抵制。
但是,某些人闲的没事干,就喜欢考这个,所以在vs环境下,浅浅分析一下。
为什么不同编译器会出现不同的答案?
vc/linux: 在进行加法运算时,求出了左值和右值后,就求出他们的和,再进行下一步运算。
例:a+b+c+d
先求a+b,再求(a+b)+c,最后求((a+b)+c)+d。
vs:在多个式子相加时,先求出各个因式的值,最后一
起执行加法操作。
例:j=(i++)+(i++)+(i++)
每个因式中i先被赋值为3,三个因式执行加法操作。接着i继续自增。
3+3+3=9.
i=3+1+1+1
例:j=(i++)+(++i)+(i++)
第一个因式,i被赋值为3,第二因式i+1=4,所以此时i被赋值为四,第三个因式,i继续被赋值为四。三个因式,执行加法操作。接着i继续自增。
4+4+4=12
i=4+1+1
七.算术表达式
算术表达式 :用算术运算符、圆括号将操作数连接起来的符合C语法规则的式子。
C语言算术表达式的书写形式与数学表达式相似,但有区别,使用时应注意以下几点:
- C表达式中,乘号“*”不能缺省。
数学式2b-4ac,相应的C算术表达式应为:2*b-4*a*c
- C表达式中只能使用系统允许的标识符。
如:数学式 2πr,相应的C表达式只能是:2*3.14159*r或2*PI*r(PI是已经定义的表示圆周率的符号常量)
- C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序。
如:(a+b)/(c-d)
- C算术表达式只能使用圆括号改变运算的优先顺序;
而数学中,可以使用大括号,中括号,小括号。C语言只能用( )。
ps:书写表达式时为清晰可见,可在运算符和操作数之间适当地增加一个空格。这样做并不影响程序的意义。
八.逗号运算
本身没有具体的计算功能,仅仅是将多个表达式连接在一起。
逗号表达式的格式:
表达式1,表达式2,....,表达式n
求解过程:
按顺序依次计算表达式1,表达式2,......,直到表达式n,整个表达式的值就是表达式n的计算结果。
如:a=b=2+3,4+b,4*b,a+b.
计算过程:
先计算表达式“a=b=2+3”,得到a=b=5;再计算第2个表达式“4+b”,得到9;然后再计算机第3个表达式“4*b”,得到20,最后计算第4个表达“a+b”,得到10,这个值也是整个表达式的值。
- 逗号运算符的优先级是所有运算符中最低的,结合方向是左结合。
ps:
并不是所有出现在程序中的逗号都是逗号表达式,如:变量定义语句的变量列表中,各变量之间的逗号是标点符号而不是运算符。