C陷阱与缺陷_理解

				 <C陷阱与缺陷>理解
  1. if(x=y) 此语句为将y的值赋值给x,然后判断值是0或是非0,也就是最终x的值决定是真是假
  2. 如果一个整型变量第一个字符是数字0,他就会被当作八进制数
  3. 下列hello和hello1等效
    char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
    char hello1[] = {"hello\n"};
	printf(hello);
    printf(hello1);
  1. 以下代码的意图是:如果x等于0运行下面if,如果0不等于x则输出error,但是结果却大相径庭,因为if总与它最近的那个else匹配(除非有花括号),所以此结果相当于0等于x后判断0是否等于y,如等于输出Y否则输出错误,如果要避免此类错误,在if || else后用花括号是个良好的习惯
    if(0 == x)
        if(0 == y)printf("Y\n");
    else
    {
        printf("ERROR\n");
    }
  1. 使用指针时,应当避免指针和指针所保存地址里的内容混淆,如,
char *p, *q;  
p = "abc";
q = p;

注意,q和p都保存了"abc\0"的地址,而不是把p指向的内容赋值到q;

  1. 这段代码中,本意是把a数组清零,单却有"意外效果",本来i<10,写成i<=10,也就是说,在数组a后的一个字的内存被清0,如果这段程序的编译器是按照内存地址递减的方法来给变量分配内存,那么内存中被清零的变量则是i,所以这段程序陷入死循环,持续打印0~9.
    int i=0,a[10];

    for(i=1; i<=10; i++)
    {
        a[i] = 0;
        printf("%d\n",i);
    }
  1. 如果int a ;在函数体外定义,那么说明了此变量是一个外部整型变量,同时为a分配了存储空间,没有赋值,所以初始值为0
  2. 如果有以下宏定义
#define max(a,b) ((a)>(b)?(a):(b));

在使用时,定义一个x数组,循环判断找最大,

int x[] = {2,3,1,4};
while(i<n)
{
	num = max[big,x[i++]]
}
//展开
//num = ((big)>(x[i++])?(big):(x[i++]));

展开max,宏定义则会出现此类问题,重复了,解决此类问题有两种方案,1.使用函数。2.在使用时避免此类使用(如下)

for(i=0; i<n; i++)
{
	num = max[big,x[i]]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值