不常见的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

 

posted @ 2012-06-05 23:52  Moon_Bird  阅读(607)  评论(0编辑  收藏  举报