c语言程序_现代方法 第2版
- 第四章 表达式
- 4.1 算术表达式
- 4.2 赋值运算符
- 4.3 表达式求值的顺序
- 第五章 选择语句
第四章 表达式
4.1 算术表达式
(1)“由实现定义”的行为:c语言故意对c语言的部分内容未加定义,并认为其细节可以由“实现”来具体定义,所谓实现是指定在特定的平台上编译、链接和执行所需要的软件。因此,根据现实不同程序的行为可能会稍有差异,C89运算符/和运算符%对负数的行为就是一个有实现定义行为的例子。
(2)运算符的优先级和结合性来实现运算的。
(3)左结合:从左向右结合。右结合:从右向左结合。
4.2 赋值运算符
(1)副作用:通常我们不希望运算符修改它们的操作数,数学中运算符就是如此,表达式i+j不会改变i或j的值,只是计算出i加j的值。
大多数c语言运算符不会改变操作数的值,但是也会有一些改变,由于这类运算符所做的不再仅仅是计算出值,所以称他们有副作用,简单赋值运算符是已知的第一个有副作用的运算符,它改变了运算符的左操作数,表达式i=0求值产生的结果为0,并(作为副作用)把0赋值给i。
(2)左值:左值表示存储在计算机内存中的对象,而不是常量或计算的结果。变量是左值。
4.3 表达式求值的顺序
(1)有了运算优先级和结合性,并不能计算确定的值,还要依靠求值的顺序。
(2)未定义的行为:在表示中,既在某处访问变量的值,又在别处修改它的值是不可取的。这样出现的结果不唯一,不同编译器给出的编译结果可能是不同的,但这还不是唯一可能发生的事情:首先程序可能无法通过编译,就算通过了编译也可能无法运行,就算运行也有可能崩溃、不稳定或者产生无意义的结果。
我们要尽量避免这样的行为出现,把复杂的表达式变成多个简单的语句。
第五章 选择语句
(1)c89中的布尔值
用int flag=0或1来表示真假
(2)c99中的布尔值
提供了_Bool型来声明布尔变量,是无符号整形变量,但只能赋值1或0;
(3)Switch语句往往比级联式if语句更容易阅读。此外,Switch语句往往比if语句执行速度快。
(4)控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给Switch语句后面的语句。
(5)需要break语句是由于Switch语句实际上是一种“基于计算的跳转”。对控制表达式求值,控制会跳转到与Switch表达式的值相匹配的分支标号处。分支标号只是一个说明Switch内部位置的标记。在执行完分支的最后一个语句后,程序控制“向下跳转”到下一个分支的第一条语句上,而忽略下一个分支的分支符号。如果没有break语句(或者其他某种跳转语句),控制将会从一个分支继续到下一个分支。