算数运算符
在之前的章节中,我们使用到了+运算符,用于两个数据对象的相加。=运算符,用于将=号右边的值赋值给左边。这一章中,我们将详细认识一下C语言中的运算符。
1. 赋值运算符=
C语言中,赋值运算符将=号右边的值,赋值给=号左边的变量中。千万不要把=号当做数学中的等于。
将字面常量100赋值给整型变量a。
int
TIPS:
字面常量就是直接写在程序里面的不可变更的数据对象,例如:100,200,"hello",'a'。它们不需要声明,也不能被赋值。
将字面常量100赋值给整型变量a,将字面常量200赋值给b。a与b相加后的值300,赋值给c。
int
下面几种赋值是错误的,字面常量不能被更改。
"Hello"
2. 加法运算符+
加法运算符用于将两侧的值相加。100加200,为300。运算符作用于字面常量或变量均可。
int
3. 减法运算符-
加法运算符用于将两侧的值相加。a的值等于100减200,为-100。
int
请注意,如果需要出现负值,请勿使用unsigned int。虽然,将unsigned int使用%d(有符号整型的转换符)来打印结果仍然是正确的。原因是,有符号和无符号整型数据表示方法一致。因此,使用%d来打印时,仍然可以得到正确的结果。但是,我们这里的类型是unsigned int,应当使用%u,以符合语义化。用%u打印会将最高位符号位看做数据位。所以,当无符号整型装了一个负数的时候,结果应当是溢出。具体原因请参照整型章节。
4. 符号运算符+、-
符号运算符用于表示一个数值是正数还是负数,它仅需要一个操作数据对象,被称之为一元运算符。而加法运算符、减法运算法,需要两个操作数据对象,被称之为二元运算符。
符号运算符+,我们一般省略不写+100,就是100。
a的值+100,被符号运算符-,转换为-100。之后再赋值给a。a的值最后变为-100。
int
5. 二元运算符与一元运算符
6. 乘法运算符*
*是乘法运算符,注意不要用字母x来表示乘法了。
c的值为10乘10,100。
int
7. 除法运算符
/是除法运算符。
int
a的值为5,b的值为2。那么5除以2,应该等于2.5。但是,好像用int来接收整型好像不太对。我们把c改为float或double。
int
结果依然不对呢。我们来看看为什么。a,b都是整型,在C语言里面,整型与整型运算的结果,依然是一个整型,结果的小数部分被丢弃,这一过程被称作截断。a / b后,结果仍然是一个整型,数值已经被截断了,这时候,我们再赋给一个浮点型的c。也只能是整数2转成浮点2.0了,没有起到效果。
那我们将a,b,c都改为float。这样就不会出现截断了。a , b将会进行浮点运算,结果也是一个浮点数类型float。
8. 求余运算符
%百分号,用于求余。例如:10除以3,等于3余1。
int
9. 自增、自减运算符
自增运算符++,和自减运算符--。用于将数据对象加1或减1。这两种运算符有两种形式,前缀模式和后缀模式。首先,我们来看一下前缀模式。++或--放置于数据对象前面。
a被加了1,b被减了1,很好理解。
那么我们继续看一下后缀模式。++或--放置于数据对象后面。
后缀模式下,为什么第一次printf打印出来的a和b仍然都是10呢?而第二次打印出来的就是分别加一和减一的结果了。
自增运算符在后缀模式下:返回数据对象原先的值, 并对数据对象进行自增或自减操作。
不过目前,你可以看做在封号;号前,一定会发生自增、自减。
那我们来解释一下,为什么第一个printf打印的是10。首先++和--都对a和b进行了自增、自减操作。所以,a的值是11,b是9。但是,++,和--运算符,返回了原先的值,传进了printf。那么,进入printf函数的a和b依然都是10。
下面的例子中,请记住后缀++或--,其实已经改变了数据对象的值了。但是,它返回并继续参与运算的数值,仍然是原始值。
10. 运算符优先级
C语言的四则运算符和数学里面的一致。先算括号里面的,先乘除后加减。
下表是常用的运算符优先级表格
优先级越高的,在运算里面,需要被优先处理。例如:乘除优先级为13大于加减的12。
其中,结合性是指,从左往右运算符还是从右往左运算符。
12 / 3 * 2,我们应当先算12 / 3得4,之后4 * 2得8。这是从左到右的结合性。
先算3 * 2得6,再算12 / 6得2,这是从右到左的结合性。显然,乘除应当是从左到右的结合性。
我们之前常常用到的赋值,为什么先把=号右边的算完,再将结果给左边的变量呢?因为,赋值是一个优先级运算符,并且结合性从右向左的运算符。所以,我们往往先将赋值号右边的优先级高的计算完之后,再算赋值,从右向左,赋给左边的变量。