《c专家编程》笔记--在等待时类型发生了改变

C语言规定,不同类型的数据需要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间通过类型转换便可以进行混合运算(但不是所有类型之间都可以进行转换)

.当混合不同类型的变量进行计算时,便可能会发生类型转换

#include
#include
int main(int argc, char**argv){
    unsigned int right = 1;
    char left = -1;
    if(left < right)printf("%d < %d\n", left, right);
    else if(left == right)printf("%d = %d\n", left, right);
    else printf("%d > %d\n", left, right);
    system("PAUSE");
    return 0;
}

运行结果是:-1 > 1

解释:按步骤进行.

1. 如果其中一个操作数为long double类型,则另一个操作数被转换为long double.

2. 否则,如果其中一个操作数为double, 则另一个操作数被转换为double.

3. 否则,如果其中一个操作数为float, 则另一个操作数也转换为float.

4. 否则,两个操作数进行 "整型升级":

    a. 如果其中一个操作数为unsigned long int, 则另一个操作数也被视为unsigned long int.

    b. 否则,如果其中一个操作数为long int,而另一个操作数类型是unsigned int, 并且long int能够表示unsigned int的所有值,则另一个操作数也被视为long int;如果long int不能表示unsigned int的所有值,则两个数都被视为unsigned long int.

    c. 否则, 如果其中一个操作数是long int,则另一个操作数也被视为long int.

    d. 否则, 如果其中一个操作数是unsigned int, 则另一个操作数也被视为unsigned int.

    e. 否则, 两个操作数都被视为int.


按照上面的规则,left转成unsigned int,为4294967295,所以大于1

如果代码修改成如下:

unsigned char right = 1; 

int left = -1;

则结果为:

1>-1

按照上面的规则,2个数都被看成int,所以-1>1

你可能感兴趣的:(《c专家编程》笔记)