易错题
427字约1分钟
2025-4-23
细节一:
i = 6
时,for循环停止循环,内部代码不执行;但不影响 i = 6
int i = 0, sum = 0;
for (i = 1; i < 6; i++)
;
printf("%d", i);
// 输出结果为
6
细节二:
// 第一个数组中的数可以省略
int a[] = {12};
int b[][3] = {{12}, {21}};
// 第二个数组中的数不可以省略
int b[2][] = {{12}, {21}};
// 完整的写法
int b[2][3] = {{12}, {21}};
字符串赋值:
字符串赋值:
char a[10] = "hello";
strcpy(a, "hello1");
char b[10] = {'1', '2', '3', '4', '5'};
char str1[10], str2[10] = {"books"};
char c[4] = {'1', '2', '3', '\0'};
strcpy(str1, c);
printf("%s", str1);
// 以下是错误的赋值方法
char b[10];
b = "Hello";
int c = 10;
char a[c];
循环:
// 为无限循环
for (int i = 0; ; i++) {}
计算:
int x = 2, y = 3;
// 从右往左计算
// x *= y ==> x * y = 6; x = 6
// x -= 6 ==> x - 6 = 0; x = 0
// y += 0 ==> y + 0 = 3; y = 3
// x = 0; y = 3
y += x -= x*= y;
printf("%d %d", x, y); // x = 0, y = 3
字节:
utf-8
中 中文占3个字节
gbk
中 中文占2个字节
char str[] = "你好";
gbk:2 + 2 + 1 = 5
utf-8:3 + 3 + 1 = 7
指针:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = &a[3];
int b = p[4];
printf("%d", b); // b = 8
p[4]
等价于 *(p + 4)
,其含义是从指针 p
所指向的位置开始,向后偏移 4 个元素的位置,并访问该位置的元素。
由于 p
指向 a[3]
(值为 4),那么 p + 4
指向的是 a[3 + 4]
,即 a[7]
。而数组 a
中 a[7]
的值为 8
。
所以,b = p[4]
实际上是将 a[7]
的值赋给了变量 b
,b
的值为 8
。