您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > C语言 循环 操作符 表达式
1第四章4.1空语句本身只包含一个分号;当不需要语句执行任何任务,而程序要求必须出现有一条完整的语句时,空语句就可以派上用场。eg:P53改变else从属的if语句。4.2表达式语句C不存在专门的赋值语句,而是使用表达式进行赋值。区分表达式语句和赋值语句;“没有效果的语句”和“有用的工作(副作用)”printf函数,对函数本身的返回值并不感兴趣,需要的是它的副作用,输出内容。24.4if条件语句if(expression)statementelsestatementx=y+3;ch=getchar();表达式语句,有赋值操作符,有作用;y+3;getchar();表达式语句,无赋值操作符,y+3不具备任何效果,getchar()读取输入中的下一个字符之后便将其丢弃。expression可以是任何能够产生整型结果的表达式--零值表示“假”,非零值表示“真”,没有布尔型。整型值0或1,而非布尔值“真”或“假”。else语句从属于最靠近它的不完整的if语句3while语句while(expression)statement遇到break语句,永久终止循环,执行完break语句之后,执行流下一条执行的语句就是循环正常结束后应该执行的那条语句。遇到continue语句,永久终止当前的那次循环,执行完continue语句之后,执行流接下来重新测试表达式的值。出现于循环体内部的这两条语句,只影响最内层的循环,不会影响外层循环的执行。4.5while语句44.6for语句for(expression1;expression2;expression3)statementexpression1初始化部分;expression2条件部分;expression3调整部分;statement为循环体。for语句和while语句执行过程的区别在于continue语句出现时,在for语句中,continue语句跳过循环体的剩余部分,直接回到调整部分。在while语句中,调整部分是循环体的一部分,所以continue将会把它也跳过。5for循环的一个风格上的优势:那所有用于操作循环的表达式收集在一起,放在同一个地点便于寻找。4.7do语句dostatementwhile(expression);当需要循环体至少执行一次的时候,选用do64.8switch语句switch(expression){statement-list}贯穿于语句列表之间的时一个或多个case标签,形式如下:caseconstant-expression;switch语句的执行过程,首先是计算expression的值,然后,执行流转到语句列表中其case标签值与expression的值匹配的语句。case标签只是确定语句列表的进入点,而不是划分语句列表。default子句:当表达式的值与所有的case标签的值都不匹配,这个default子句后面的语句就会执行。所以每个switch语句中只能出现一条default子句。74.9goto语句goto语句把程序的执行流从一条语句转移到另一条语句。应该避免使用goto语句原因:不容易读懂,花费较长的时间弄清代码的结构。8第五章5.1操作符移位操作符算术左移和逻辑左移是一样的,算术右移和逻辑右移不同算术右移:左边移入的位由原先该值的符号位决定,符号位为1则为移入的位均为1,符号位为0则为移入的位均为0.逻辑右移:左边移入的位都是零。算术移位还是逻辑移位由编译器决定。(算术右移主要是因为考虑了运算时的溢出)位操作符&|^按位进行与或异或赋值charch;...while((ch=getchar())!=EOF)...getchar返回一个整型值,首先存储于ch中将导致它被截短,再被提升为整型并与EOF比较将会在循环不该终止的地方终止,或者是永远不会终止。(?)复合操作符+=、-=、*=、/=、%=、=、=、&=、|=、^=a+=expression;+=操作符的左操作数只求一次,程序员可以将代码写得更清楚一些,编译器可以产生更为紧凑的代码。9单目操作符!逻辑反操作~对整型类型的操作数进行求补操作&取地址操作符inta,*b;...b=&a;把一个现有变量的地址赋值给一个指针变量;*操作符是间接访问操作符,它与指针一起使用,用于访问指针所指向的值。表达式b的值是变量a的地址,*b的值是a的值。sizeof的操作数是一个数组名时,返回该数组的长度,以字节为单位。sizeof(a=b+1)并没有向a赋任何值,只是返回a这类变量所占的字节数。10增值操作符++和减值操作符--操作符的结果不是被它们所修改的变量,而是变量的拷贝值,所以无法向一个值进行赋值。故++a=10;错11关系操作符、=、、=、!=、==这些操作符产生的结果都是整型值,而不是布尔值。如果两端的操作数符合操作符指定的关系,表达式的结果是1,如果不符合,表达式的结果为0,因其类型为整型,所以可以将其赋给整型变量。在每对语句中,两条语句的功能是相同的。既可以用关系操作符来实现,也可以通过测试表达式的值来实现12逻辑操作符expression1&&expression2左为假,则不再进行求值expression1||expression2左为真,则不再进行求值(所谓短路求值)不要将逻辑操作符与位操作符混淆条件操作符expression1?expression2:expression3首先计算的是expression1,若它的值为非零值,那么整个表达式的值就是expression2的值,expression3不会进行求值。如果expression1的值是假,那么整个条件语句的值为expression3的值,expression2不会进行求值。(应用)13下标引用和结构成员下标引用是一对方括号,下标引用操作符接受两个操作数,一个数组名和一个索引值。事实上下标引用不仅局限于数组名。C的下标值总是从零开始,并且不会对下标识进行有效性检查(编译和运行的两种不同的概念,编译时只会检查出语法错误,所以检查不出来下标的有效性)。除了优先级不同之外,下标引用操作和间接访问表达式是等价的。array[下标];*(array+(下标));下标引用实际上是以后面的这种形式实现的。结构成员.和-操作符用于访问一个结构的成员。如果s是一个结构变量,那么s.a就访问s中名叫a的成员。当有一个指向结构的指针而不是结构本身,且欲访问它的成员时,就需要用-操作符。5.2布尔值C并不具备显式的布尔类型,而是用整数来代替。规则是:零是假,任何非零值皆为真。灵活使用布尔值和整型值14尽管所有的非零值都被认为是真,但是当在两个(真值)之间相互比较的时候必须小心,因为许多不同的值都可能代表真。#defineFALSE0#defineTRUE1...if(flag==FALSE)...if(!flag)...if(flag==TRUE)...if(flag)...看上去这两对语句都是等价的,但如果flag设置为任意的整型值,那么第二对语句就不是等价的。只有当flag确实是TRUE或FALSE,或者是关系表达式或逻辑表达式的结果值时,两者才是等价的。155.3左值和右值左值就是那些能够出现在赋值号左边的东西,右值就是那些能够出现在赋值号右边的东西。标识了一个特定位置的表达式可以用作左值。inta,*pi;...pi=&a;*pi=20;第二条赋值语句的左边那个值显然是一个表达式,但它却是一个合法的左值,因为指针pi的值是内存中某个特定位置的地址,*操作符使机器指向那个位置。当它作为左值使用时,这个表达式指定需要进行修改的位置。当它作为右值使用时,它就提取当前存储于这个位置的值。5.4表达式求值隐式类型转换C的整型算术运算总是以缺省整形类型的精度来进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升。16chara,b,c;...a=b+c;b和c的值被提升为普通整型,然后在执行加法运算。加大运算的结果将被截短,然后在存储于a中。算术转换如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另外一个操作数的类型,否则就无法进行操作。下面的层次体系成为寻常算术转换。longdoubledoublefloatunsignedlongintlongintunsignedintint如果某个操作数的类型在上面这个列表排名中较低,那么它首先转换为另外一个操作数的类型再执行操作。17操作符的属性复杂表达式的求值顺序是由3个因素决定的:操作符的优先级、操作符的结合性以及操作符是否控制执行的顺序。lexp左值;rexp右值操作符优先级详见表5.1优先级和求值的顺序两个相邻的操作符的执行顺序由它们的优先级决定,若优先级相同,则执行顺序由它们的结合性决定。除此之外,编译器可以自由决定使用任何顺序对表达式进行求值,只要它不违背逗号、&&、||和?:操作符所施加的限制。18K&R是C语言的开发者BrianW.Kernighan,DennisM.Ritchie(人名),C是指他们的著作《C程序设计语言》被誉为C语言圣经,所有C程序开发人员都必看的,但书内容过于简洁,不适用于初学者。在K&RC中,编译器可以自由决定以任何顺序对类似下面这样的表达式进行求值。a+b+cx*y*z之所以允许编译器这样做是因为b+c(或y*z)的值可能可以从前面的一些表达式中获得,所以直接复用这个值比重新求值效率更高。加法运算和乘法运算都具有结合性,这样做的缺点是:(举例说明)考虑下面的表达式,它使用了有符号整型变量:x+y+1如果表达式x+y的结果大于整型所能容纳的值,它就会产生溢出。在有些机器上,下面这个测试if(x+y+10)的结果取决于先计算x+y还是y+1,因为两种情况下溢出的地点不同,经验显示,ANSIC标准不允许这样做。19下面这个表达式说明了一个相关的问题f()+g()+h()尽管左边那个加法运算必须在右边那个加法运算之前执行,但对于各个函数调用的顺序,并没有规则加以限制。如果他们的执行具有副作用,比如执行一些I/O任务或修改全局变量,那么函数调用顺序的不同可能会产生不同的结果。因此,若顺序的改变能使结果产生区别,最好使用临时变量,让每个函数调用都在单独的语句中进行。temp=f();temp+=g();temp+=h();
本文标题:C语言 循环 操作符 表达式
链接地址:https://www.777doc.com/doc-4209061 .html