运算符、表达式和语句
本文主要学习以下内容:
- 关键字:while、typedef
- 运算符:= 、- 、 、/ 、% 、++ 、-- 、(类型名)*
- C语言的各种运算符
- 运算符优先级以及语句、表达式含义
- while循环
- 复合语句、自动类型转换和强制类型转换
- 如何编写带有参数的函数
基本运算符
- 赋值运算符:=
在C语言中,=并不意味着相等,而是一个赋值运算符。赋值表达式语句为:
bmw = 2002;
意味着把值2002赋给变量bmw,=号左边是一个变量名,右边则是赋给该变量的值。赋值行为是从右往左进行的。可以这样写:
i = i + 1;
意味着先找出变量 i 的值,把该值加1,然后把新值赋值变量i。
在编写代码时要注意,=号的左侧必须是一个变量名,实际上,=号的左侧必须引用一个存储位置,最简单的方法就是使用变量名,也可以使用指针。概括的说,=号的左边必须是一个可以修改的左值。
- 四则运算符:+ 、- 、* 、/ 、
四则运算符和数学中的表达一样,要注意除法运算符(/)计算时得到的结果会舍弃掉小数部分,这一过程被称为截断。也叫趋零截断,会向零靠拢,所以如果结果是-3.8,会转换成-3。 - 运算符优先级
C语言规定,每个运算符都有自己的优先级,和普通的算术运算符一样,乘法运算符和除法运算符的优先级比加法和减法高,如果是同级别的运算符,按从左到右的顺序执行。
其他运算符
- 求模运算符:%
求模运算符用于整数运算,得到的结果是左侧整数除以右侧整数的余数。
根据趋零截断,可以归纳出负数的求模运算。如果第一个运算对象是正数,那么求模的结果也是正数;如果第一个运算对象是负数,那么求模的结果也是负数。
11 / 5 的2,11% -2 得1
11/ -5 得-2,11% -2 得1
-11 / -5 得2,-11%-5 得-1
-11 /5得-2,-11%5 得-1 - 递增/递减运算符:++/–
递增/递减运算符有两种方式出现,第一种,++/–出现在其作用得变量前面,这是前缀模式,第二种,++/–出现在其作用得变量后面,这是后缀模式。
a_post = a ++; //后缀:使用a的值之后,递增a
b_pre = ++b; //前缀:使用b的值之前,递增b
表达式和语句
- 表达式:
表达式由运算符和运算对象组成,最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。
-4
4+21
a*(b+c/d)/20
q=5*2
x=++q %3
q>3 - 语句:
C把末尾加上一个分号的表达式都看作语句。 - 复合语句:
复合语句是用花括号括起来的一条或多条语句,复合语句也称为块。
类型转换
通常,在语句和表达式中应使用类型相同的变量和常量。但是,如果使用混合类型,C不会像其他语言那样死掉,而是采用一套规则进行自动类型转换。虽然这很便利,但是有一定危险性。
-
当类型转换出现在表达式时,无论是unsigned 还是signed 的char和short都会被自动转换成int,如有必要会被转换成unsigned int,这些转换类型被称为升级。
-
涉及两种类型的运算,两个值会分别转换陈两种类型的最高级别。
-
类型的级别从高至低是long double 、double 、 float 、unsignedlong long 、long long 、 unsigned int 、 int。例外的情况时,当long 和 int的大小相同时,unsigned int比long级别高。之所以short和char类型没有列出,是因为它们已经被升级到int 或unsigned int。
-
在赋值表示式语句中,计算的最终结果会被转成被赋值变量的类型。这个过程可能导致类型升级或降级。所谓降级,是指把一种类型转换成更低级别的类型。
-
当作为函数参数传递时,char和short被转换成int,float被转换成double。
-
强制类型转换:
通常,应该避免自动类型转换。然而,有时我们需要进行精确的类型转换,或者在程序中表明类型转换的意图。这种情况要用到强制类型转换,即在某个量的前面放置用圆括号 括起来的类型名,该类型名即时希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符,其通用形式是:
mice = 1.6 + 1.7;
mice = (int)1.6 + (int)1.7;
第一行使用自动类型转换;
第二行使用强制类型转换。
带参数的函数
程序的函数一般为:
void pound(int n):{
}
其中,void pound(int n)
为函数头,该函数接受一个int类型的参数,所以圆括号中包含一个int类型变量n的声明。
声明参数就创建了被称为形式参数的变量。上面的函数中,int类型的变量n就是形式参数,简称形参。如果我们像pound(10)
这样调用函数,那么,10就是实际参数,简称实参。
注意:这里是10的值被拷贝给变量n,同时,变量名是函数私有的,即在函数中定义的变量不会和别处的相同名称的变量发生冲突。