4.1 关系运算
选择语句的作用是使程序根据某些条件自动地选择执行哪些语句或者不执行哪些语句。由于选择语句多半是根据数据之间的关系进行判断选择的,为此首先介绍C语言中的关系运算。
4.1.1 “<”的数学含义及代码含义
在数学中,“<”用来描述或表示两个数量之间的关系。如:
但在C语言中,“<”和“+”、“-”、“*”、“/”等一样是一种运算。如:
由于3的确小于4,所以3<4的运算结果为1,而:
由于4<3这个关系并不成立,所以4<3运算得到的值为0。
由此可见,在数学中“<”是一种关系描述符号。但在C的源代码中,“<”是一种运算符号。这是两者本质的区别。数学中的“<”告诉你的是一种数量关系,而在C代码中,“<”是要求计算机求一个值。
4.1.2 4种关系运算符
C语言有4种关系运算符(Relational Operators):
它们都是二元运算符,要求的运算对象实数类型(Real Type)(1)。如果指定的关系(小于、小于或等于、大于、大于或等于)成立,表达式的值为it类型的1,否则表达式的值为int类型的0。例如:
运算的结果是1,而:
运算的结果是0。
这几个运算符的优先级相同,都为10,低于加法、减法运算,高于赋值运算。结合性从左到右。因此,下面表达式:
的含义是:
显然,这个表达式的值为1。
4.1.3 常见误区及与常识不符的结果
1.数学惯性
初学者应该特别注意的是如下一些表达式和数学中的含义截然不同:
在数学里,这个式子描述的是5、4、3之间的大小次序,这里的“>”是一种关系描述符号。但在C的源代码中,“>”是一种运算符,根据“>”的结合性,这个表达式意味着:
由于子表达式(5>4)的值为1,所以整个表达式的值显然为0。
2.违背常识
当两个操作数的类型不同时,编译器按照算术转换规则对操作数进行转换。对于一个是signed整数类型、另一个是unsigned整数类型的情况时,需要特别当心,因为C语言的解释很可能不同于你的想法。例如:
这个表达式中,由于int类型的-1和unsigned类型的0U的转换阶相同,-1需要先被转换成unsigned类型。由于(unsigned)-1的值为42949672950,所以实际运算的是:
结果显然为1而不是0。
练习
求下面各表达式的值。