面向刚开始学习C语言的同学,汇总了一些C语言常见的问题。下方蓝色的字体就是链接啦:)
一、头文件<stdio.h>与"stdio.h"的区别
二、主函数main与return 0
- main()、void main()与int main()我们写代码时如何选取?
- 为什么我们要在main函数结尾加上return 0?
- 带参数的main函数 int main(int argc,char *argv[])简介
三、字符输入问题与输入输出缓冲区
为什么我们在使用getchar()或scanf输入字符时总是不能正确读入?
四、变量与类型转换
- C语言常见变量类型
- 隐式类型转换与强制类型转换
- 斐波那契数列:如何存储和运算超长整数 、 高精度/高精度超长整数运算除法器
五、字符串
- 为什么会有“烫烫烫”乱码
- 常见字符串操作(字符串输入输出、长度计算、参数传递)
- string.h头文件常用函数举例
六、指针与数组
- 指针概述、地址与整数的运算、指针作参数的传递、多级指针
- 数组概述、数组作参数的传递、多维数组
- 指针数组与数组指针的区别
- 安全地使用指针——如何避免野指针?
- 数组初始化的四种方法
七、动态内存分配
单向链表的遍历,节点的插入、删除和交换
八、文件的I/O操作
- 文件概述、文件路径
- 文件的输入输出缓冲区、fopen与fclose
- 文件定位——文件读写指针
- 标准文件输入输出
九、其他
- ++i与i++详解,(++i)+(++i)+(++i)与(i++)+(i++)+(i++)的值
- Windows API入门:C语言实现彩色圣诞树
十、补充
1.bool类型未定义问题
error:unknown type name 'bool'
原因:
该问题常见于C程序(.c文件类型)中。在C99标准之前,C语言没有定义布尔类型。而C99标准中虽然引入了_Bool关键字表示布尔类型,但仍未引入bool关键字,因此如果直接使用bool类型编译器就会报错。
解决办法:
1) 使用_Bool关键字来表示布尔类型。_Bool变量只能取0或1,其中0为假,1为真。
2) 添加stdbool.h头文件,就可以直接使用bool、true和false了。stdbool头文件为了与C++中的bool关键字兼容,定义了布尔变量的宏。
3) 使用CPP文件来存储程序(在创建项目时选择C++)。因为C++是兼容C的,对于CPP文件编译器会将其当作C++程序来编译,而C++中定义了bool关键字。
2.不同枚举类型的变量之间赋值,没有使用强制转换,编译器未报错
说明:
v1为enum enum1类型变量,v2为enum enum2类型变量, 一般我们不允许不同枚举变量之间直接赋值,除非使用强制转换。
有些C语言的教科书会告诉你,不同枚举变量之间直接赋值编译器会报错,例如“v2=v1;”“v2=A;”编译器会提示error。然而,在上述例子中编译器并没有报错。
原因:
首先,我们可以在左上角看到这个程序是用.c文件存储的。如果你把代码写在.cpp文件里,codeblocks会把它当C++程序处理,调用g++来编译,C++语法更加严格,不同类型的枚举变量之间直接赋值编译器就会报错;而如果你把代码写在.c文件里,codeblocks把它当C程序处理,调用gcc来编译,C语言语法相对C++来说没那么严格,因此编译器没有报错。
总的来说,如果你想让编译器在不同枚举变量之间直接赋值时报错,在创建项目时语言就选取C++(即生成.cpp文件)。注意,即使你使用了强制转换,我们也不推荐不同枚举类型的变量之间相互赋值。
拓展:
gcc和g++都是GNU下的编译器。对于.c文件,gcc把它当C程序处理,g++把它当C++程序处理;对于.cpp文件,gcc和g++都会把它当C++程序处理。C++虽然兼容C,但C++的语法相对C来说要更加严格,所以一些能用gcc编译通过的C程序,用g++编译就会报错。
此外要注意一下 g++是可以编译C程序(.c文件)的,g++在编译C程序和C++程序时都会调用gcc,同时g++对C和C++程序都会做C++语法的检查。你可以理解为g++把C程序也当C++程序来处理了。
从某种程度上来说,gcc也是可以编译C++程序(.cpp文件)的,但需要使用g++完成C++库的链接,或者使用-lstdc++选项链接到C++的库(例如:gcc main.cpp -lstdc++)。
更多推荐
C语言 | 常见问题汇总
发布评论