《C 陷阱与缺陷》1 - 词法“陷阱”篇

一、= 不同于 ==

1、将 == 误用成 =

#include <stdio.h>

int main()
{
  int x = 0;
  int y = 0;

  if (x = y)
    printf("x == y\n");
  else
    printf("x != y\n");  /* 被执行 */

  return 0;
}

2、将 = 误用成 ==

if ((fd == open(...)) < 0)
{
  /* 即使 open 执行失败,也不会被执行,因为 == 的结果只有 0 和 1 */
  printf("open() error:%s\n", strerror(errno));
}

二、整型常量

如果一个整形常量的第一个字符是数字 0,那么该常量将被视作八进制数,因此,10 与 010 的含义截然不同

#include <stdio.h>

int main()
{
  int x = 0215;

  printf("x:%d\n", x);  /* x:141 */
}

需要注意这种情况,有时候在上下文中为了格式对齐的需要,可能无意中将十进制数写成八进制数,例如:

struct 
{
  int   part_number;
  char *description;
} parttab[] = 
{
  046, "left-handed widget",
  047, "right-handed widget",
  125, "frammis",
};

十六进制

如果一个整形常量的前两个字符是 0x/0X,那么该常量将被视作十六进制数,因此,10 与 0x10 的含义截然不同

#include <stdio.h>

int main()
{
  int x = 0x215;
  int y = 0X215;

  printf("x:%d, y:%d\n", x, y);  /* x:533, y:533 */
}

三、字符与字符串

用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,对于采用 ASCII 字符集的编译器而言,‘a’ 的含义与 0141/0x61/97 严格一致,而用双引号引起的字符串代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符 ‘\0’ 初始化

#include <stdio.h>

int main()
{
  char hello[] = {'H','e','l','l','o','\n',0};

  printf(hello);
  printf("Hello\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值