常见易错点
-
=
与==
混淆。
- 循环后面加了
;
。
- 链接错误是因为找不到某函数声明对应的函数实现。
- 无限循环:
for (char ch = 0; ch <= CHAR_MAX; ch++);
- 动态分配内存需要检查是否分配成功。
-
extern char *hello
和extern char hello[]
不一样,前者为声明字符指针,后者为声明字符数组。
- 求值顺序无法确定:
y[i] = x[i++]
y[i++] = x[i]
-
char
的取值范围是依据范围而确定,有些是-127至128,有些是0-255,应使用unsigned char
而不要使用char
。
- 以下代码是错误的,因为getchar()的返回值为int,若char是0-255,则永远也不会等于EOF。应将c声明为int。
char c;
while ((c = getchar()) != EOF);
- 以文件读写模式
"r+"
打开,要从读入文件状态切换成写入文件状态,或者从写入文件状态切换成写入文件状态,需要调用fseek()
或者fsetpos()
来改变文件状态。文件的起始状态则看第一次对文件的操作为读取还是输入。
- 除余
%
所得结果的符号由左操作数决定。
数组
代码
#include <cstdio>
int main() {
int a[3][3];
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("* a = %p\n", * a);
printf("a[0] = %p\n", a[0]);
printf("&a[0] = %p\n", &a[0]);
printf("&a[0][0] = %p\n", &a[0][0]);
return 0;
}
结果
a = 0060FF0C
&a = 0060FF0C
* a = 0060FF0C
a[0] = 0060FF0C
&a[0] = 0060FF0C
&a[0][0] = 0060FF0C
可变参数
简介
-
va_list
:用于声明可变参数名字。
-
va_start
:通过传入省略号前一个参数,来定位可变参数开始位置。
-
va_arg
:通过传入类型来确定每个实参数据类型。
-
va_end
:用于结束。
简单示例
#include <cstdio>
#include <cstdarg>
#include <cstdlib>
void print_arg(int n, ...) {
int temp;
va_list arg;
va_start(arg, n);
while (n--) {
temp = va_arg(arg, int);
printf("%d\n", temp);
}
va_end(arg);
}
int main() {
print_arg(3, 10, 20, 30);
return system("pause");
}
do while (0)
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
- 加上大括号的解决方案不够好,需要有意识去省略分号:
#define FOO(x) { foo(x); bar(x); }
if (condition)
FOO(x)
else
...;
- 使用
do { … } while (0)
可以完美解决问题:
#define FOO(x) do { foo(x); bar(x); } while (0)
if (condition)
FOO(x);
else
....;