C 编程基础/预备知识
首先,一个非常简单的 C 程序示例
/* Sample C program that outputs the word "Hello" */
#include <stdio.h>
int main()
{
printf("Hello\n");
return 0;
}
上面示例中显示的程序被称为程序源代码。源代码由字母、数字和其他符号的组合组成。源代码可以通过程序员/用户使用任何文本编辑器创建。
在课堂上,我们将使用以下格式编写 C 程序
#include <stdio.h>
int main()
{
/* ...your variable declarations... */
/* ...your statements... */
return 0;
}
所有 C 程序都由一系列指令组成。在 C 语言中,指令也称为语句。在英语中,语句以句号、问号或感叹号结尾。请注意,在 C 语言中,语句以分号结尾。在上面的示例程序中,只有一个语句——printf() 语句。
所有语句都应该写在用户定义的函数内部。你可以将函数看作是一组或一系列语句。它类似于英语,其中一段话由一系列语句组成。术语“用户定义”表示函数的描述是由用户定义(或编写)的。在上面的示例程序中,只有一个用户定义的函数——main() 函数。所有 C 程序都必须包含 main() 函数。
符号 { 被称为左大括号或左花括号。同样,符号 } 被称为右大括号或右花括号。大括号用于分组。可以将左大括号看作是开始的同义词,将右大括号看作是结束的符号。因此,在上面的示例程序中,左大括号和右大括号分别表示 main() 函数的开始和结束。请注意,大括号必须成对出现。缺少大括号是导致语法错误的最常见原因之一。
正如我们将在后面看到的,大括号用于对多个语句进行分组。
符号 /* 和 */ 用于对程序内部的注释进行分组。注释不是指令,而是简单地提供额外的信息(文本描述),例如程序在做什么、输入是什么、输出是什么等。可以将 /* 视为注释的开始,将 */ 视为注释的结束。与大括号一样,这些符号总是成对出现的。注释是可选的,可以放置在程序源代码中的任何位置。
可以在 /* */ 中编写多行注释。例如
/* The following is
an example
of a very simple C program */
void main()
{
printf("Hello\n");
}
请注意,注释不能嵌套,这意味着不能将 /* */ 放入 /* */ 中。例如,以下操作是错误的
/*
this is a comment
/* this is one more comment - which will cause an error */
*/
其他符号,即 #include <stdio.h>
和 void 的含义将在后面解释。
数据和用于操作数据的指令都以其名称来表示。在 C 语言中,为某些内容命名时有一些规则和约定,如下所示
1. 名称由字母和数字组成。
2. 第一个字符必须是字母。
3. C 语言区分大小写,这意味着小写字母 'a' 与大写字母 'A'不相同。
4. 下划线符号 _ 在 C 语言中被视为字母。但是,不建议将它用作名称的第一个字符。
5. 至少名称的前 31 个字符是有效的。
示例
以下是一些有效的名称示例
a
A
main
void
hello
salary
rate_per_hour
student_1
student_2
student_3
First_Name
ComputeGrade
以下是一些无效的名称示例
1 /* must start with a character */
1_ab /* must start with a character */
a& /* & symbol cannot be used in a name */
xyz_% /* % symbol cannot be used in a name */
$money /* must start with a character,
$ cannot be used in a name */
作为一种语言,C 语言拥有自己的词汇表——一组关键字。这些名称是保留的,不能用于其他目的,例如命名用户定义的变量名。在示例程序中,名称 void 是一个关键字。
ANSI C 语言有 32 个关键字(仅此而已!)。
请注意,名称 printf 实际上不是 C 语言关键字,也不是 C 语言的真正组成部分。它是一个标准输入/输出库的预定义名称。这些区别将在后面解释。
常量是指其值不会改变的实体。常量可以是数值常量或字面常量。
示例
数值常量的示例
1
500
-10000.100
3.1416
字面常量的示例
'A'
"Hello"
"The quick brown fox jumped over the lazy dog."
注意:在C语言中,只有一个字符的字面常量被称为字符。它用一对单引号括起来。如果有多个字符,则被称为字符串。字符串用一对双引号括起来。
程序由数据和操作这些数据的指令组成。注意,数据必须存储在某个地方,因此需要 RAM 中的某个内存空间。
变量是用来存储数据的实体。没有变量,就没有办法(或者实际上没有地方)存储数据。变量具有
- 一个名称(更准确地说是一个符号名称)
- 一个关联的物理内存空间(RAM 中的一部分)
- 一个数据类型
- 一个值(取决于数据类型)
- 一个作用域
- 一个生命周期
作用域和生命周期的概念将在课程的后面部分讨论。
数据类型指定
- 该类型变量可以假设的值的种类
- 该类型变量可以假设的值的范围
- 变量为存储该类型的值所需的内存量(以字节为单位)
有四种基本数据类型,分别是
- char - 字符数据类型。 char 数据类型用于表示/存储/操作字符数据值。一个 char 数据类型值需要一个字节的内存空间。 char 值可以假设的值范围为 0 到 255。使用的数字到字符编码是 ASCII。
- int - 整数数据类型。 int 数据类型用于表示/存储/操作有符号的整数数值。
- float - 单精度浮点数据类型。 float 数据类型用于存储单精度有符号实数(即带小数点的数字)。
- double - 双精度浮点数据类型。 double 数据类型用于存储双精度有符号实数(即带小数点的更大的数字)。
存储一个 int、一个 float 和一个 double 所需的内存空间是平台相关的(取决于机器和软件)。对于 32 位机器(以及 32 位编译器,如 Microsoft C 编译器),一个 int 和一个 float 各需 4 个字节的内存,而一个 double 则需要 8 个字节的内存。
注意,一个 char 数据实际上是数值(0 到 255),被视为 int 值的子集。任何对整数值的运算(将在后面讨论)也可以对字符执行。
作业
找出以下数据类型的值范围(最小值和最大值):int、float、double 在您的平台上。提示:尝试查找与 C 编译器一起提供的两个名为 "limits.h" 和 "float.h" 的文件。
以下程序可用于打印基本数据类型的大小
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Size of char: %d\n", sizeof(char));
printf("Size of int: %d\n", sizeof(int));
printf("Size of float: %d\n", sizeof(float));
printf("Size of double: %d\n", sizeof(double));
_getch();
return 0;
}
sizeof 是 C 中的关键字。它是一个运算符,返回上面显示的指定数据类型的大小(以字节为单位)。
变量声明是在程序/函数中“引入”变量的“动作”。C 程序中的所有变量都必须声明。如果您忘记这样做,编译器将报告语法错误。
在 C 中,声明变量的语法如下
<数据类型> <变量名称>
符号 <项目> 表示需要指定一对尖括号中包含的项目。分号表示声明的结束。缺少分号将导致编译器生成语法错误。变量的命名应遵循 C 命名约定。
示例
char ch;
int i;
float f;
double d;
可以在同一行上声明多个相同类型变量。在这种情况下,两个变量之间应插入逗号。缺少逗号将生成语法错误。
示例:<syntaxhighlight lang="c" char ch1, ch2;
int x, y, z;
float hourly_rate, number_of_hours, salary;
double numerator, denominator; </syntaxhighlight>
是的,只要您遵循命名约定,并且不使用 C 保留字。
但是,建议您作为良好的编程实践使用描述性或提示性名称。例如,如果您知道变量将代表兼职工人的时薪,则不要使用 xyz 或 x1 之类的名称。最好使用 rate 或 hourly_rate 之类的变量名。注意,使用下划线使变量名易于阅读。
默认情况下,C 中变量的值是垃圾,这意味着该内存空间中存储了某些内容,但该内容对于预期用途无效。
变量必须正确初始化。初始化是指为变量分配有效值。使用带有垃圾值的变量将导致逻辑错误,这是一种非常难以发现的错误。
练习
1. 将中间名首字母声明为字符变量
2. 将年龄声明为整数变量
3. 将存款金额、取款金额声明为浮点变量
4. 将长度、宽度、高度声明为双精度数据类型变量