表达式(十二)
八、关系运算符
关系运算符包括:小于运算符(<)、大于运算符(>)、小于等于运算符(<=)、大于等于运算符(>=),其语法格式分别如下所示:
expression < expression
expression > expression
expression <= expression
expression >= expression
其中expression为表达式。
对于关系运算符,其操作数的类型应满足以下条件之一:
-- 左操作数和右操作数都具有实数类型。
4 < 5
-- 左操作数和右操作数都是指向限定或者非限定版本的兼容对象类型的指针。
int arr[8]; int *p1 = &arr[1]; int *p2 = &arr[6]; p2 > p1;
如果一个操作数是十进制浮点类型(decimal floating type),另一个操作数不能是标准浮点类型(standard floating type)。
// 以下关系表达式非法; // 1.23DD是_Decimal64类型,属于十进制浮点类型; // 1.24是double类型,属于标准浮点类型。 1.23DD < 1.24
如果关系运算符的操作数都具有算术类型,操作数会执行常用算术转换(usual arithmetic conversions)。
如果关系运算符指定的关系为真,运算结果为1,如果关系运算符指定的关系为假,运算结果为0。+0和-0相等。关系运算符运算结果的类型是int类型。
5 > 4; //表达式的值为1。 6 > 5 > 4; //表达式的值为0。
关系运算符具有左结合性,表达式6 > 5 > 4的运算顺序为(6 > 5) > 4,因为6大于5,则将1和4进行比较;因为1小于4,所以最终结果为0。
当两个指针比较时,运算结果取决于指针指向对象在地址空间中的相对位置。如果两个指针指向同一对象或者指向同一数组最后一个元素之后的那个元素,两个指针是相等的。
int arr[5]; /*指针P1和指针P2相等。*/ int *p1 = &arr[5]; int *p2 = arr + 5;
如果两个指针指向同一结构的不同成员,指向后声明结构成员的指针比指向先声明结构成员的指针大。
struct { int a; int b; }s; int *p1 = &s.a; int *p2 = &s.b; p2 > p1; //表达式p2>p1的值为1。
指向同一联合不同成员的所有指针都是相等的。
union { int a; float f; }u; /*指针p1和指针p2相等。*/ int *p1 = &u.a; int *p2 = (int *)&u.f;
如果两个指针指向同一数组的元素,指向具有较大下标值数组元素的指针比指向具有较小下标值数组元素的指针大。
int arr[8]; int *p1 = &arr[1]; int *p2 = &arr[6]; p2 > p1; //表达式p2 > p1的值为1。
如果指针p指向数组元素,指针q指向同一数组的最后一个元素,则表达式q+1大于表达式p。
int arr[8]; int *p = &arr[7]; int *q = &arr[7]; printf("%d\n", q+1>p); //输出1。
指向非数组元素指针的行为与指向长度为1的数组的第一个元素的指针行为相同,数组元素类型与指针指向对象的类型相同。
int i; int *ptr = &i; (ptr+1) > &i;