一、= 不同于 ==
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");
}
776

被折叠的 条评论
为什么被折叠?



