【C深入】优先级

易错的优先级

【C深入】优先级

typedef struct _demo
{
    int* pInt;
    float f;
} Demo;

int func(int v, int m)
{
    return (v & m != 0);        //优先级!=高于&,应改为return ((v & m) != 0); 
}

int main()
{   
    Demo* pD = (Demo*)malloc(sizeof(Demo));
    int  *p[5];       //优先级[]高于*,应改为int*  p[5];
    int  *f();          //优先级()高于*,应改为int*  f();
    int i = 0;
 
    i = 1, 2;         //优先级=高于,,应改为 i = (1, 2);
    
    *pD.f = 0;     //优先级.高于*,应改为pD->f = 0;
    
    free(pD);
    
    return 0;
}


C语言隐式类型转换

算术运算式中,低类型转换为高类型;

赋值表达式中,表达式的值转换为左边变量的类型;

函数调用时,实参转换为形参的类型;

函数返回值,return表达式转换为返回值类型

【C深入】优先级

例1

char c = 'c';

short s = 0;

s = c;

printf("%d\n", sizeof(s+c));   //输出为4

char型和short型参与运算时,必须先转换成int

例2

int i = -2;
unsigned int j = 1;
if( (i + j) >= 0 )
{
        printf("i+j>=0\n");
}
else
{
        printf("i+j<0\n");

}
printf("i+j=%d\n", i + j);   //输出i+j>=0回车i+j=-1

i在内存中补码十六进制形式为0xFFFFFFFFFFFFFFFE,由于参与了算术运算,转换为unsigned int型,加j等于0xFFFFFFFFFFFFFFFF,为unsigned int型,所以大于0;

printf中,%d是以int型输出,0xFFFFFFFFFFFFFFFF是-1的补码,所以会输出-1。

类型转换更多请看http://blog.****.net/selooloo/article/details/5016836