目录
循环简介
该程序用#define指令创建符号常量和用const限定符创建在程序运行过程中不可更改的变量。 接下来使用while循环,让计算机做重复的计算。
当程序第1次到达while循环时,会检查圆括号中的条件是否为真,该程序中,条件表达式如下:
shoe < 18.5
变量shoe被初始化为3.0,显然小于18.5.因此,该条件为真,程序进入块中继续执行,循环中shoe = shoe + 1.0,改变了shoe的值。此时,程序返回while入口部分检查条件。为何要返回while的入口部分?因为上面这条语句的下面是右花括号(}),代码使用一对花括号({})来标出while循环的范围。花括号之间的内容就是要被重复执行的内容。花括号以及被花括号括起来的部分被称为块。该循环过程一直持续到shoe的值为19.0。相当于19<18.5,所以该条件为假。
出现这种情况后,控制转到紧跟while循环后面的第1条语句。
基本运算符
c用运算符表示算术运算。例如,+运算符使在它两侧的值加在一起。基本算术运算的运算符:=,+,-,*和/。
----赋值运算符:=
在c语言中,=并不意味着“相等”,而是一个赋值运算符。下面的赋值表达式语句:
bmw = 2002
把值2002赋给变量bmw。也就是说,=号左侧是一个变量名,右侧是赋给该变量的值。符号=被称为赋值运算符。另外,上面的语句不读作“bmw等于2002”,而读作“把值20023赋给变量bmw”。赋值从右往左进行。
在c语言中,类似这样的语句没有意义(实际上是无效的):
2002 =bmw;
因为在这种情况下,2002被称为 右值,只能是字面常量,不能给常量赋值,常量本身就是它的值。因此,在编写代码时要记住,=号左侧的项必须是一个变量名。实际上,赋值运算符左侧必须引用一个存储位置。最简单的方法就是使用变量名。指针也可以用于指向一个存储位置。c使用可修改的左值标记那些可赋值的实体。
----几个术语:数据对象,左值,右值和运算符
赋值表达式语句的目的是把值存储到内存位置上。用于存储值的数据存储区域统称为数据对象。使用变量名是标识对象的一种方法。左值是c语言的术语,用于标识特定数据对象的名称或表达式。因此,对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。
右值指的是能赋值给可修改左值的量。右值可以是常量,变量或者其他可求值的表达式(如,函数调用)。实际上,当前标准在描述这一概念时使用的是表达式的值。
被称为“项”(如,赋值运算符左侧的项)的就是运算对象,运算对象是运算符操作的对象。“吃汉堡”描述为:“吃”(运算符)操作“汉堡”(运算对象)。类似地可以说,=运算符的左侧运算对象应该是可修改的左值。
许多其他语言都会回避该程序中的三重赋值,但是c完全没问题。赋值的顺序是从右往左:首先把68赋给jane,然后再赋给rarzan,最后赋给cheeta。
----加法运算符:+
加法运算符用于加法运算,使其两侧的值相加。例如,语句:
printf(“%d”,4+20);
打印的是24,而不是表达式
4+20
相加的值(运算对象)可以是变量,也可以是常量。因此,执行下面的语句:
income = salary + bribes:
计算机会查看加法运算符右侧的两个变量,把它们相加,然后把和赋给变量income
----减法运算符:
减法运算符用于减法运算,使其左侧的数减去右侧的数。例如,下面的语句把200.0赋给takehome:
takehome = 224.00 - 24.00;
+和-运算符都被称为二元运算符,即这些运算符需要两个运算对象才能完成操作。
----符号运算符:-和+
减号还可用于标明或改变一个值的代数符号。例如,执行下面的语句后,smokey的值为12:
rocky = -12;
smokey = -rocky;
以这种方式使用的负号被称为一元运算符。一元运算符只需要一个运算对象。c90标准新增了一元+运算符,它不会改变运算对象的值或符号,只能这样使用:
dozen = +12;
----乘法运算符: *
该程序打印数字1-20的平方。
----除法运算符:/
整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。这使得5除3很让人头痛,因为实际结果有小数部分。再c语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断。
整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果。混合整数和浮点数计算的结果是浮点数。实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型。本例中,在进行除法运算前,整数会被转换成浮点数。对于负数,c99
规定使用趋零截断,所以,应把-3.8转换成-3。
---运算符优先级
每个运算符都有自己的优先级。正如普通的算术运算那样,乘法和除法的优先级比加法和减法高,所以先执行乘法和除法。如果两个运算符的优先级相同怎么办?如果它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对于大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。
运算符 | 结合律 |
() | 从左往右 |
+ -(一元) | 从右往左 |
* / | 从左往右 |
+ -(二元) | 从左往右 |
= | 从右往左 |
----优先级和求值顺序
首先,圆括号的优先级最高,=运算符的结合律是从右往左。
其他运算符
c语言有大约40个运算符,有些运算符比其他运算符常用得多。
----sizeof运算符和size_t类型
sizeof运算符以字节为单位返回运算对象得大小(在c中,1字节定义为char类型占用的空间大小。运算对象可以是具体的数据对象(如,变量名)或 类型。
c语言规定,sizeof返回 size_t 类型的值。这是一个无符号整数类型,但它不是新类型。size_t是语言定义的标准类型。c头文件系统可以使用typedef 把size_t作为 unsigned int 或 unsigned long 的别名。这样,在使用size_t类型时,编译器会根据不同的系统替换标准类型。
----求模运算符:%
求模运算符用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。例如,13%5(读作 “13求模5”得3,即13除以5的余数是3.求模运算符只能用于整数,不能用于浮点数。
程序使用一个计数器来控制while循环。当计数器超出给定的大小时,循环终止。该程序通过scanf()为变量sec获取一个新值。只要该值为正,循环就继续。当用户输入一个0或负值时 ,循环退出。这两种情况设计的要点是,每次循环都会修改被测试的变量值。
负数求模:如果第1个运算对象是负数,那么求模的结果为负数,那么求模的结果为负数,如果第1个运算对象是正数,那么求模的结果也是正数。
----递增运算符
递增运算符执行简单的任务,将其运算对象递增1。该运算符以两种形式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。两种模式的区别在于递增行为发生的时间不同。
这种缩写形式,让代码结构紧凑,程序更为简洁,可读性更高。例如:把变量的递增过程放入while循环的条件中,这种结构在c语言中很普遍 。这么做的好处是,它把控制循环的两个过程集中在一个地方。该循环的主要过程是判断是否继续循环,次要过程是改变待测试的元素。
递增运算符的另一个优点是,通常它生成的机器语言代码效率更高,因为它和实际的机器语言指令很相似。尽管如此,随着商家退出的c编译器越来越智能,这一优势可能会消失。一个智能的编译器可以把x = x + 1当作++x对待。
a和b都递增了1,但是,a_post是a递增之前的值,而pre_b是b递增之后的值。这就是++的前缀形式和后缀形式的区别。
a_post = a++; //后缀:使用a的值之后,递增a
pre_b = ++b: //前缀:使用b的值之前,递增b
----递减运算符:--
每种形式的递增运算符都有一个递减运算符与之对应,用--代替++即可:
--count; //前缀形式的递减运算符
count--; //后缀形式的递减运算符
----优先级:
递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。因此,x*y++表示的是(x)*(y++),而不是(x+y)++。不过后者无效,因为递增和递减运算符只能影响一个变量(或者,更普遍地说,只能影响一个可修改的左值),而组合x*y本身不是可修改的左值。如果n++是表达式的一部分,可将其视为“先使用n,再递增”,而++n则表示“先递增n,再使用”。
使用递增递减运算符遵循一下规则:
1.如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符
2.如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符
表达式和语句
c的基本程序步骤由语句组成,而大多数语句都由表达式构成。
----表达式
表达式由运算符和运算对象组成(运算对象是运算符操作的对象)。最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。下面是一些表达式:
4
-6
4+21
a*(b+c/d)/20
q = 5 * 2
x = ++q % 3
q > 3
运算对象可以是常量,变量或二者的组合。一些表达式由子表达式组成(子表达式即较小的表达式)
----每个表达式都有一个值
c表达式的一个最重要的特征是,每个表达式都有一个值。要获得这个值,必须根据运算符优先级规定的顺序来执行操作。在上面列出的表达式中,前几个都很清洗明了。但是,有赋值运算符(=)的表达式的值是什么?这些表达式的值与赋值运算符左侧变量的值相同。因此,表达式q = 5*2作为一个整体的值是10。那么,表达式 q > 3的值是多少?这种关系表达式的值不是0就是1,如果条件为真,表达式的值为1;如果条件为假,表达式的值为0.
表达式 | 值 |
-4+6 | 2 |
c = 3 +8 | 11 |
5 > 3 | 1 |
6 + ( c = 3+8) | 17 |
----语句
语句是c程序的基本构建块。一条语句相当于一条完整的计算机指令。在c中,大部分语句都以分号结尾。因此,
legs = 4
只是一个表达式(她可能是一个较大表达式的一部分),而下面的代码则是一条语句:
legs = 4;
最简单的语句是空语句:
; //空语句
c把末尾加上一个分号的表达式都看作是一条语句(即,表达式语句)。因此,像下面这样写也没有问题:
8;
3 + 4;
----副作用和序列点
c语言的术语副作用,副作用是对数据对象或文件的修改。例如,语句:
states = 50;
它的副作用是将变量的值设置为50。副作用?这似乎更像是主要目的!但是从c语言的角度看,主要目的是对表达式求值。给出表达式states = 50,c会对其求值得50。对该表达式求值的副作用是把变量states的值改为50。
类似地,调用printf()函数时,它显示的信息其实是副作用(printf()的返回值是待显示字符的个数)。
序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在c语言中,语句中的分号标记了一个序列点。意思是,在一个语句中,赋值运算符,递增运算符和递减运算符对运算对象做的改变必须在程序执行下一条语句之前完成。另外,任何一个完成表达式的结束也是一个序列点。
什么是完成的表达式?所谓 完整表达式 ,就是指这个表达式不是另一个更大表达式的子表达式。
----复合语句(块)
复合语句是用花括号括起来的一条或多条语句,复合语句也称为块。整个复合语句被视为一条语句
whlie() while(){
{
} }
左边的复合语句强调形成一个块,右边的复合语句突出了块附属于while循环
声明参数就创建了被称为形式参数的变量。我们称函数调用传递的值为实际参数,简称实参。
变量名是函数私有的,即在函数中定义的变量名不会和别处的相同名称发生冲突。
程序开头的函数原型在这里发挥了作用。原型,即是函数的声明,描述了函数的返回值和参数。pound()函数的原型说明了两点:
1.该函数没有返回值(函数名前面有void关键字)
2.该函数有一个int类型的参数
练习题
假设所有变量的类型都是int,下列各项变量的值是多少?
x = (2+3) * 6 x = 30
x = (12+6)/2 *3 x = 27
y = x = (2+3) /4 x =1 y = 1
y = 3+2*(x = 7/2) x = 3 y = 9
假设所有变量的类型都是int,下列各项变量的值是多少?
x = (int)3.8 +3.3 x = 6 (由3 + 3.3 截断而来)
x = (2+3) *10.5 x = 52 (5 * 10.5 = 52.5)
x = 3 / 5 * 22.0 x = 0 (0 * 22.0的结果)
x = 22.0 * 3 /5 x = 13(66.0 / 5或13.2)
编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号 常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。
编写一个程序,提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印5~15的所有整数。包括5和15)。要求打印的各值之间用一个空格,制表符或换行符分开。
编写一个程序,提示用户输入天数,然后将其转换成周数和天数。例如,用户输入18,则转换成2周4天。以下下面的格式显示结果:
18 days are 2 weeks,4 days.
通过while循环让用户重复输入天数,当用户输入一个非正值时(如0或-20),循环结束。
编写一个程序,提示用户输入一个double类型的数,并打印该数的立方值。自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给函数。
编写一个程序,显示求模运算的结果。把用户输入的第1个整数作为求模运算符的第2个运算对象,该数在运算过程中保持不变。用户后面输入的数是第1个运算对象。当用户输入一个非正值时,程序结束。其输入示例如下:
this program computers moduli.
Enter an integer to serve as the second operand:256
now enter the first operand:438
438 % 256 is 182
enter next number for first operand(<= 0 to quit):1234567
1234567 % 256 is 135
enter next number for first operand(<=0 to quit): 0
Done
计算20天里赚多少钱的程序(假设第1天赚1$,第2天赚2$,以此类推)。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)。