C语言的运算符分为算术运算符,赋值运算符,逗号运算符等等,在此只讨论列出的三种运算符。
一 在讨论运算符前,先了解一些概念:
1.表达式的构成:运算符 和 操作数构成字符序列 =>表达式。
注意:(1)表达式都是有值的
(2)表达式都是有类型的
2.隐式类型转换:整型(包括int、short、long)和浮点型(包括float、double)可以混合运算。字符型数据可以与整型通用(字符型数据本质上也是将字符对应的编码值储存在内存中),因此,整型、浮点型、字符型数据间可以混合运算。
例如:2+'q'+ 12.345*'p'是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。
转换的规则如图所示:
(1)从右向左一定会转换。但c99标准下,float与float之间计算并不会转换到double类型进行计算。
(2)从下向上,不同精度的类型混合运算时,此时,低精度往高精度转换 。
3.强制类型转换:将运算数强制转换为指定的类型,强制类型转换 不会影响原先运算数的值。
4.贪心原则: 从左到右逐个字符扫描,尽可能多的结合成c的运算符。如a+++++a => ((a++)++)+a,此时是不合法的。
二 算数运算符
算数运算符常用的有:+,-,*,/,%,++,--等,这些都是基本的数学概念,在此不过多赘述,只讨论%和自增自减的一些知识。
1.%
(1)注意点:小数不能做取模运算。
取模运算结果的符号取决于左操作数。
(2)常用的场景:判断奇偶数。
产生一定范围的数。如:a%n 会产生在 0~n-1 范围的数字。
2.++,--
(1)注意点:在参与其他运算中,a++ -> 先用后加,++a -> 先加后用
++/--运算数必须是一个左值 (可以被修改左值),左值(lvalue)是指可以被定位的量。
且不要在一个表达式中,对同一个变量,连续多次自增自减(随编译器不同,结果也不同)
三 赋值运算符
赋值运算符常用的有=( 赋值运算,赋值运算可以进行链式操作,如a=b=c=1。),+=,-=,*=,/+,%=等。
1.不同精度类型间的混合赋值
(1)将double/float类型的值赋值给int/short/long/long long类型的变量,此时精度丢失。
(2)将长类型的值赋值给短类型的变量(如将int类型的值赋值给short类型的变量),此时发生高位截断,只能保留段类型大小的数据。
(3)将短类型的值赋值给长类型的变量(如将short类型的值赋值给int类型的变量),如果短类型的值有符号,长类型的高位将短类型的符号位扩展;如果短类型的值无符号,则长类型高位补0。
2.+=,-=,*=,/+,%=:如a += 1 => a = a + 1。
四 逗号运算符(顺序求值运算符)
表达式1,表达式2,...,表达式n => 最后一个表达式计算的结果充当逗号表达式的结果。