目录
前言
这个专栏是在本人简单学完C语言,并开始初步学习C++的过程中创作的,如有错误请多多指正和包涵。由于本次创作的主要参考书目为《C Primer Plus》,因此我会将该书内容作为主要部分,然后对书中的概念和案例进行浅浅地解读并总结。希望各位多多支持!
另外,我使用的编程环境为WIN11,VS2022,本专栏也都沿用该环境。
本节主要内容
1. 运算符——=;
2. 函数——main()、printf();
3. 编写一个简单的C程序;
4. 创建整型变量;
5. 换行字符;
6. 注释;
7. 函数初步(简单认识函数);
8. 程序改错;
9. 关键字。
一个简单的C程序
#include<stdio.h>
int main() /*一个简单的C程序*/
{
int num; /*定义一个名为num的变量*/
num=1; /*为num赋值*/
printf("I am a simple "); /*使用printf()函数*/
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);
return 0;
}
程序详解
1、 #include指令和头文件
#include<stdio.h>的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置,这是一种“拷贝-粘贴”的操作。include文件提供了一种方便的途径共享许多程序共有的信息。
#include这行代码是一条C预处理器指令。C编译器在编译前会对源代码做一些准备工作,即预处理。(这一部分将在后续的预处理一节中详细说明)
stdio.h的含义是标准输入/输出头文件(其中,“std”是“standard”的简写,即标准;“i”是“input”的简写,即输入;“o”是“output”的简写,即输出)。在C程序顶部的信息集合被称为头文件。大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信息(如定义的一些常量、函数声明和函数的使用方法等)。头文件帮助编译器把程序正确地组合在一起。
要注意,省略必要的头文件可能不会影响某一特定程序,但最好不要省略。
2、 main()函数
C程序一定从main()函数开始执行(在不考虑其他特殊情况下)。圆括号在这里的用于识别main()是一个函数。函数是C程序的基本模块。
int main()也可能会写成void main()的形式。一些编译器允许这样写,但并非所有的标准都认可这种写法。因此尽量少用这种形式。
注意:使用void main()的形式时,最后的“return 0;”不要写。
3、 注释
注释有两种方法,一种是用“/* */”括起来,另一种是用“//”。
前者可以将要解释的内容放在同一行,也可放在多行。在/*和*/之间的内容都会被编译器忽略。
后者普遍用于C++和Java,仅限于单行。
注意:①在使用第一种注释时要将注释的内容全删除,并将/*和*/删除掉,不可留一半。(该注释方法一般成对存在。若只有前一半,则从该行其,以下所有行均被注释)
②注释不要嵌套使用(这样会使程序可读性变差)。
4、 花括号、函数体和块
花括号把main()函数括起来。一般所有的C函数都使用花括号标记函数体的开始和结束,只有花括号能起这样的作用。不能省略。
花括号还可以把函数中的多条语句合并为一个单元或块。
5、声明
声明是C语言最重要的特性之一。分号在C语言中是大部分语句和声明的一部分。
声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型。在C语言中,所有变量都必须先声明才能使用。
关键字是语言定义的单词,不能做其他用途。(如int)
标识符是一个变量、函数或其他实体的名称。(如num)
给变量命名时要使用有意义的变量名或标识符。若无法清楚地表示自身的用途,可在注释中进一步说明。
命名规则:可以用小写字母、大写字母、数字和下划线(_)来命名;名称的第一个字符必须是字母或下划线,不能是数字(由于操作系统和C库经常使用以一个或两个下划线字符开始的标识符,因此最好避免在自己的程序中使用这种名称);C语言的名称区分大小写,即把一个字母的大写和小写是为不同的字符。
声明变量的4个理由:
1、把所有的变量放在一处,方便查找和理解程序的用途。
2、声明变量会促使你在编写程序前做一些计划。
3、声明变量有助于发现隐藏在程序中的小错误。
4、若未事先声明变量,C程序就无法通过编译。(这是无法抗拒的理由)
6、赋值
赋值是C语言中基本操作之一。赋值表达式语句从右侧把值赋到左侧。该语句以分号结尾。
7、printf()函数
圆括号表明printf是一个函数名。原括号中的内容是从main()函数传递给printf()函数的信息,即实际参数。
在C语言中,实际参数(实参)是传递给函数的特定值,形式参数(形参)是函数中用于存储值的变量。
在实例中,printf()中“\n”是换行符。换行符是一个转义序列。转义序列用于表示难以表示或输入的字符。每个转义序列都是以反斜杠字符(\)开始。“%d”相当于一个占位符,其作用是指明输出num值的位置。
8、return语句
有返回值的C函数要有return语句。该语句以关键字return开始,后面是待返回的值,并以分号结尾。
在使用int main()时,可以省略main()函数末尾的return语句。(但不建议)
简单程序的结构
程序由一个或多个函数组成必须有main()函数。函数由函数头和函数体组成。函数头包括函数名、传入该函数的信息类型和函数的返回类型。函数体被花括号括起来,由一系列语句、声明组成。
/*一个简单的C程序的格式*/
#include<stdio.h>
int main()
{
语句
return 0;
}
/*大部分语句都以分号结尾*/
提高程序可读性的技巧
选择有意义的函数名和写注释。注意,使用这两种技巧时应相得益彰,避免重复啰嗦。
在函数中用空行分隔概念上的多个部分。C语言并未规定一定要使用空行,但这样能提高程序的可读性。
每条语句各占一行。同上,虽然这未没有明确规定,但这样可以提高程序的可读性。
进一步使用C
多条声明
在声明时,可以用逗号隔开两个变量。如,“int a,b;”和“int a;int b;”等价。
打印多个值
待输出的变量位于双引号后面。变量之间用逗号隔开。需要打印几个变量,就要几个占位符。但占位符必须与变量的数据类型相匹配。
待打印的值不一定是变量,只要是可求值得出合适类型值的项即可。
多个函数(函数原型、函数定义)
函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也称为函数声明。函数原型指明了函数的属性。
函数定义的形式与main()函数相同,都包含函数头和用花括号括起来的函数体。函数头重述了函数原型的信息。
注意:①何时执行函数取决于它在main()中被调用的位置,而不是它的定义在文件中的位置。
②无论main()在程序文件中处于什么位置,所有C程序都从main()开始执行。
调试程序
程序的错误通常称为bug,找出并修正错误的过程叫做调试(debug)。
语法错误
如果不遵循C语言的规则就会犯语法错误。C语言的语法错误指的是,把有效的C符号放在错误的地方。
如何发现程序的语法错误?首先,在编译之前,浏览源代码看是否能发现一些明显的错误。接下来,查看编译器是否发现错误,检查程序的语法错误是它的工作之一。编译器发现错误会报告错误信息,指出每一处错误是它的工作之一。
但即使如此,某处隐藏的语法错误会导致编译器误判。即使编译器没有报告错误,程序也可能会编译不成功。编译器的另一个常见的毛病是,报错的位置比真正的错误滞后一行。
语义错误
语义错误是指意思上的错误。在C语言中,如果遵行了C规则,但是结果不正确,那就是犯了语义错误。
编译器无法检测语义错误,因为这类错误并未违反C语言的规则。所以,这类错误需要程序员自己找错误。
程序状态
程序状态是在程序的执行过程中,某给定点上所有变量值的集合。它相当于计算机当前状态的一个快照。
一种追踪状态的方法:自己模拟计算机逐步执行程序。但是太长的程序或循环次数太多的程序显然不可能自己模拟执行程序。
定位语义错误的另一种方法是:在程序中的关键点插入额外的printf()语句,以监视指定变量值的变化。
检测程序状态的第3种方法是使用调试器。调试器是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。(这种方法根据调试器不同而不同)
关键字和保留标识符
关键字是C语言的词汇,不能用作标识符。关键字可指定不同的类型,也可用于控制程序中语句的执行顺序。如果使用关键字不当,编译器会将其视为语法错误。
auto | extern | short | while |
---|---|---|---|
break | flaot | signed | _Alignas |
case | for | sizeof | _Alignof |
char | goto | static | _Atomic |
const | if | struct | _Bool |
continue | inline | swicth | _Complex |
default | int | typedef | _Generic |
do | long | union | _Imaginary |
double | register | unsigned | _Noreturn |
else | restrict | void | __Static_assert |
enum | return | volatile | _Thread_local |
保留标识符已经被制定了它们的用途或保留它们的使用权。尽管使用这些标识符来表示其他意思是可行的,但不能随便使用。保留标识符包括那些以下划线字符开头的标识符和标准库函数名。