a>b,8<5,a+b<=c+d,(i=j+k)!=0 关系表达式的值是一个逻辑值,即非真即假的值。于是,表达式 8<5 的值为假,而表达式 >b 的值将取决于a与b的具体值,但只可能是真或假两种情况之一 C语言中没有专门的逻辑型数据而是用0。表示假,用1(或非0)表示真 因此,若a=3b=2,则a>b的值为1,而8<5的值为0。 因为关系运算符的优先级低于算术运算符,所以 a+b<=c+d 实际上相当于 (a+b)<=(c+d) 就是判定a+b的和是否小于等于c+d的和。虽然不是功能上的需要但加上括号可以使 程序更清楚易读,所以许多程序员习惯在关系表达式中用括号括起的算术表达式。 关系运算符的优先级高于赋值运算符,所以 (i=j+k)!=0 中的括号有没有是不一样的。上面表达式表示把j+k的和赋给i,然后判定i是否不等于0 如果去掉括号,实际上相当于 i=(j+k)!=0 也就是先判断j+k的和是否不为0。然后把逻辑值0或1赋给i。 第二节逻辑运算符和逻辑表达式 3.2.1逻辑运算符 逻辑运算符用于逻辑运算,也就是真假值的运算。C语言提供三种逻辑运算符: 88.逻辑与 逻辑或 逻辑非 “88”和“||”是双目运算符,它们需要两个运算量,如 (a>b)88(c>d (x==0)|(y==0) “!”是单目运算符,只需要后跟一个运算量,如 !(a>b) 逻辑运算符要求所操作的运算量是逻辑量(数值量也当做逻辑量对待),结果也是逻辑 值,如 (B>b)88(c>d) 的值是这样确定的,如果a>b为真,并且c>d为真,则(a>b)8&(c>d)为真否则为假。表 3-2给出了逻辑运算中当a与b的值为不同组合时,逻辑运算所取的值,此表称为真值表
表32逻辑运算真值表 I b 真真假 真假真 假假真真 假真假真 真假假假 一真真真假 逻辑运算符的优先级是:逻辑非!最高,逻辑与88次之,逻辑或|最低,它们与算术运 算符关系运算符、赋值运算符等的关系如图31所示 ,++,--,-(单目减) 图3-1部分运算符的优生级 由图3-1的优先级可以看出 a>b88c>d相当于(a>b)88.(c>d) y==0相当于(x==0)|(y==0) a88.b== 相当于(!a)88.(b==c) 你可能会党得C语言运算符的优先级多而且复杂,其实,这还只是其中的一部分。如果 你要怕记不住它们的关系可以按照自己的实际意思使用括号“(”。实际中,许多聪明的程 序员总是用圆括号来表明运算的先后即使有时候圆括号并不影响运算顺序这样的做的好 处是程序不容易出错,阅读起来也方便。 逻辑运算符的结合规则为:8和左结合,!右结合 3.2.2逻辑表达式 逻辑表达式用逻辑运算符连接运算量,并产生一个逻辑值。C语言中没有专门的逻辑 值,真假值用0、1代替。实际上,当判断一个值为非0时,认为逻辑值为真,一个值为0时,逻 辑值为假。而在产生逻辑值时用1表示真,用0表示假 如果a=3,b=2则 !a相当于!3为假值是0 a8&.b为真,值是1 a88.!b相当于3880,值为0 a‖|b为真,值是1 运算符8&和具有这样的性质:它们从左到右计算各运算量的值,一旦能够确定表达 式的值就不再继续运算下去,如 如果a为假(0),就不必再求b的值了,因为逻辑与运算只有当运算符两侧的运算量都为真 (非0)时才取真值,而a为假已决定了表达式的值为假。如果a为真,则要继续求b的值,以 判断表达式的真假。与此类似
旦a为真,也就不再求b的值了。由于这个性质,有时运算量的先后顺序是很重要的,如 x!=088y/x< 先判断x是否为0,只有当x不等于0时才求y/x,并判断是否小于1,而x一且为0就不再 求y/x,从而避免了除数为)的情况。 第三节i语句 3.3.1迁语句的简单形式 f语句用来判定给定的条件是否满足,根据结果(真或假)来选择执行相应的操作。它的 最简单的形式为 表达式) 语句 其含义是:如果表达式为真(非0),则执行其后所跟的语句。要注意这里没有then,因为省 略then后含义仍是很清楚的,如果你有 PASCAL、 FORTRAN等语言的编程经验,则要小 心,不要画蛇添足。 例3.1 /*求一个整数的绝对值*/ Int n i printf ("Input a number " scanf("%d",&n) if (n < o printf ("The absolute value is %d\n",n); 运行结果 The absolute value is 5 再次运行 nput a number: 10 The absolute value is 10 这种形式语句的执行过程是这样的:首先计算后面表达式的值,如果它为真(非 0),就执行后面跟着的语句;如果为假(0),就跳过整个证语句,其逻辑结构如图3-2所示, 酚32中表达式后的语句表示是一条语句如果需要多条语句就要用花括号将它们括 形成一个分程序结构,称为复合语句,它等效于一条语句 例3.2 /*按由小到大顺序输出3个整数*/
计算表达式的值 真(非0) 图32语句逻辑结构 int a, b, c, temp scanf("%d%d%d", &a, &b, &c); if (a>b)i temp =a i b /#这里不需要分号*/ if (a >c)( temp =a i if (b>c)i temp= b c= temp i printf("%d, %d, %d\n",a, b, c); 运行情况 Input three numbers 582
现在我们来看一下程序段 if (a>b)i 如果a、b的大小与要求的从小到大的顺序不符就要把它们交换一下,这时需要一个临时变 量,使用三条语句完成互换,而语句的控制范围只限一条语句,这就要用花括号将三个语 句括起,组成一个复合语句。请注意,复合语句的后面不需加分号,C语言中只有复合语句的 后面不需要分号,因为花括号可以明确地表明语句的结束(而且一个函数的函数体就相当于 个复合语句,在函数的最后加个分号,看着总有点不太舒服)。 当然,我们也可以用逗号运算符将三个语句连接成一个语句写成 if (a> b) temp =a, a=b, b= temp; 这时后只有一个语句,可以不用花括号。但大多数程序员不习惯这样表示,所以还是用花 括号为好。 3.3.2if-else结构 if语句更一般的形是 f(表达式) 语句1 语句2 其含义是:如果表达式为真(非0),就执行语句1,否则执行语句2,这里的语句1和语句2可 以是一条语句,也可以是用花括号括起的复合语句。f-else形式的逻辑结构如图3-3所示 例3.3 /*输入一个整数,判断它是奇数还是偶数*/ maino printf("input a number n")i scanf("%d",&n)i f(n%2==0) printf ("The number is even n") printf("The number is odd\n") 运行结果 In