优先级和类型转换分析
1.易错的优先级

【编程实验】
#include <stdio.h> #include <malloc.h> typedef struct _demo { int* pInt; float f; } Demo; int func(int v, int m) { return (v & m != 0); //实际上解释成 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 free(pD); return 0; }
2. C语言隐式类型转换
(1)算术运算式中,低类型转换为高类型
(2)赋值表达式中,表达式的值转换为左边变量的类型
(3)函数调用时,实参转换为形参的类型
(4)函数返回值,return表达式转换为返回值类型

int main() { char c = 'c'; short s = 0; s = c; //不会报错 printf("%d\n", sizeof(s+c)); //输出为4 }
编译的Bug吗?
【隐式类型转换带来的困惑】
#include <stdio.h> int main() { int i = -2; unsigned int j = 1; if( (i + j) >= 0 ) { printf("i+j>=0\n"); //int被转换为 unsigned int类型, 因此被执行 } else { printf("i+j<0\n"); } printf("i+j=%d\n", i + j); //i+j为全F,printf中%d又要求以int数(有符号)来打印,因此输出i+j=-1; return 0; }
浙公网安备 33010602011771号