你自己提供些C语言容易出错的题目
时间: 2024-02-09 20:09:18 浏览: 18
好的,下面是一些C语言常见的易错题目:
1. 下面的代码会输出什么结果?
```c
#include <stdio.h>
int main() {
int a = 5;
printf("%d", a++ * ++a);
return 0;
}
```
答案:不确定。这段代码的结果取决于编译器的实现方式。因为 C 语言没有规定自增自减运算符的计算顺序,所以不同的编译器可能会得到不同的结果。
2. 下面的代码存在什么问题?
```c
#include <stdio.h>
int main() {
char str1[] = "hello";
char str2[] = "world";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
```
答案:这段代码存在缓冲区溢出问题。因为 `str1` 的长度只有 6,而 `strcat` 函数会将 `str2` 中的字符追加到 `str1` 的末尾,导致 `str1` 的长度超过了 6,从而覆盖了其他内存区域的数据。
3. 下面的代码有什么错误?
```c
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++);
printf("%d", i);
return 0;
}
```
答案:这段代码没有错误,但可能跟程序员的意图不符。因为循环体为空,所以这个循环实际上什么也没有做。程序最终输出的结果是循环变量 `i` 的值,即 10。
4. 下面的代码会输出什么结果?
```c
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
printf("%d", a++ || ++b && ++c);
printf("%d%d%d", a, b, c);
return 0;
}
```
答案:这段代码会输出 1 和 2、3、3。因为逻辑或运算符 `||` 的优先级低于逻辑与运算符 `&&`,所以先计算 `++b && ++c`,结果为真,并且将 `b` 和 `c` 的值都加了 1。然后再计算 `a++ || (++b && ++c)`,结果为真,因此输出 1。最后输出的 `a`、`b`、`c` 的值分别为 2、3、3。
5. 下面的代码有什么错误?
```c
#include <stdio.h>
int main() {
char *p = "hello";
*p = 'H';
printf("%s", p);
return 0;
}
```
答案:这段代码存在运行时错误。因为 `p` 是一个指向字符串常量的指针,而字符串常量是只读的,所以不能通过指针修改其中的字符。当程序执行到第二行时,会发生段错误,导致程序崩溃。