易错的优先级
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表达式转换为返回值类型
例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.csdn.net/selooloo/article/details/5016836