不常见的BUG代码集锦
#include <stdio.h> int array[] = {12,3,4,5,6}; #define LEN (sizeof(array)/sizeof(array[0])) int main() { int d = -1; if (d <= LEN ) printf("HEHE"); else printf("HAHA"); return 0; }
代码输出为"HAHA"。
原因:
LEN的返回值为unsigned int型,if语句在signed int 与unsigned int之间测试相等性,则signed int提升为unsigned int型,
-1转化为无符号整形结果是非常大的整数,致使if表达式为假。
修正:
将if语句改成if (d <= (int)LEN )
二 关于相容类型
1 foo(const char **p) {} 2 main (int argc,char **argv) 3 { 4 foo(argv); 5 }
编译此段代码,编译器会发出一条警告信息(参数与类型不匹配),这涉及到类型相容性问题
char *s 与const char *p类型是相容的,但char **s,与const char**p却不是相容类型
以上赋值形式要合法,必须要满足下列条件:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针指向类型的全部限定符。
char **s:指向无限定符的char类型的指针的指针
const char**p:指向有const限定符的char类型的指针的指针
三 结构体初始化
struct A{
int a;
int b;
};
1 struct A a = {1,2};
以下两种为C99标准支持
2 struct A a ={.a = 2;.b=3};
3 此种操作准确来说应该叫赋值操作
struct A a;
a = (struct A){1,4};
这个是GCC对C语言的一个扩展,C99之后正式成为C语言的一个feature
(typename){……}是一个运算符,叫compound literal运算,优先级最高。这个运算的作用是可以合成出一个复杂类型的literal