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

 

转载于:https://www.cnblogs.com/moonlove/archive/2012/06/05/2537474.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值