第一个 C 语言程序
让我们从一个简单的 C 语言程序开始,这个程序会在屏幕上输出 “Hello, World!”。以下是代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
在这个程序中,#include <stdio.h>
是一个预处理指令,它告诉编译器包含标准输入输出库。标准输入输出库提供了许多有用的函数,像 printf()
和 scanf()
等。main()
函数是程序的入口点,所有的 C 程序都从 main()
函数开始执行。当程序运行时,操作系统会调用 main()
函数。printf()
函数用于在屏幕上输出文本。这里的 \n
是一个转义字符,表示换行。return 0;
语句表示程序正常结束,返回值 0 通常意味着程序执行成功。
变量和数据类型
在 C 语言中,变量用于存储数据。在使用变量之前,需要先声明它的数据类型。数据类型决定了变量可以存储的数据范围和占用的内存空间。以下是一些常见的数据类型:
int
:用于存储整数,例如int age = 25;
。整数类型在不同的系统中占用的字节数可能不同,但通常是 4 个字节,可以表示的范围大约是 -2147483648 到 2147483647。float
:用于存储单精度浮点数,例如float price = 9.99;
。单精度浮点数可以表示小数,占用 4 个字节,能提供大约 7 位的有效数字。double
:用于存储双精度浮点数,例如double pi = 3.14159;
。双精度浮点数占用 8 个字节,能提供大约 15 位的有效数字,精度比float
更高。char
:用于存储单个字符,例如char grade = 'A';
。字符类型占用 1 个字节,可以存储 ASCII 字符集中的任意字符。
下面是一个使用变量的示例:
#include <stdio.h>
int main() {
int num1 = 10;
int num2 = 20;
int sum = num1 + num2;
printf("The sum of %d and %d is %d\n", num1, num2, sum);
return 0;
}
在这个示例中,我们声明了三个整数变量 num1
、num2
和 sum
,并对它们进行了赋值和计算。首先,num1
被赋值为 10,num2
被赋值为 20。然后,将 num1
和 num2
相加的结果赋值给 sum
。最后,使用 printf()
函数输出结果。%d
是格式说明符,用于表示输出的是整数。
运算符
C 语言支持多种运算符,包括算术运算符、关系运算符、逻辑运算符等。这些运算符可以帮助我们进行各种计算和条件判断。以下是一些常见运算符的示例:
算术运算符
#include <stdio.h>
int main() {
int a = 10;
int b = 3;
int addition = a + b;
int subtraction = a - b;
int multiplication = a * b;
int division = a / b;
int modulus = a % b;
printf("Addition: %d\n", addition);
printf("Subtraction: %d\n", subtraction);
printf("Multiplication: %d\n", multiplication);
printf("Division: %d\n", division);
printf("Modulus: %d\n", modulus);
return 0;
}
在这个示例中,我们使用了加法、减法、乘法、除法和取模运算符。加法运算符 +
用于将两个数相加,减法运算符 -
用于将两个数相减,乘法运算符 *
用于将两个数相乘。需要注意的是,整数除法会截断小数部分,例如 10 除以 3 的结果是 3,而不是 3.333…。取模运算符 %
用于计算两个数相除的余数,例如 10 对 3 取模的结果是 1。
关系运算符
#include <stdio.h>
int main() {
int x = 5;
int y = 10;
int greater_than = x > y;
int less_than = x < y;
int equal_to = x == y;
int not_equal_to = x != y;
printf("x > y: %d\n", greater_than);
printf("x < y: %d\n", less_than);
printf("x == y: %d\n", equal_to);
printf("x != y: %d\n", not_equal_to);
return 0;
}
关系运算符用于比较两个值的大小关系,返回的结果是 0(假)或 1(真)。大于运算符 >
用于判断左边的值是否大于右边的值,小于运算符 <
用于判断左边的值是否小于右边的值,等于运算符 ==
用于判断两个值是否相等,不等于运算符 !=
用于判断两个值是否不相等。在这个示例中,x > y
的结果是 0,因为 5 不大于 10;x < y
的结果是 1,因为 5 小于 10;x == y
的结果是 0,因为 5 不等于 10;x != y
的结果是 1,因为 5 不等于 10。
逻辑运算符
#include <stdio.h>
int main() {
int a = 1;
int b = 0;
int logical_and = a && b;
int logical_or = a || b;
int logical_not_a = !a;
int logical_not_b = !b;
printf("a && b: %d\n", logical_and);
printf("a || b: %d\n", logical_or);
printf("!a: %d\n", logical_not_a);
printf("!b: %d\n", logical_not_b);
return 0;
}
逻辑运算符用于组合或取反布尔值。逻辑与运算符 &&
只有当两个操作数都为真时,结果才为真;逻辑或运算符 ||
只要有一个操作数为真,结果就为真;逻辑非运算符 !
用于取反操作数的值。在这个示例中,a && b
的结果是 0,因为 a
为真,b
为假;a || b
的结果是 1,因为 a
为真;!a
的结果是 0,因为 a
为真,取反后为假;!b
的结果是 1,因为 b
为假,取反后为真。
控制语句
控制语句用于控制程序的执行流程。常见的控制语句有 if-else
语句、for
循环、while
循环等。这些控制语句可以让程序根据不同的条件执行不同的代码块,或者重复执行某些代码块。
if-else 语句
#include <stdio.h>
int main() {
int age = 18;
if (age >= 18) {
printf("You are an adult.\n");
} else {
printf("You are a minor.\n");
}
return 0;
}
在这个示例中,如果 age
大于等于 18,则输出 “You are an adult.”,否则输出 “You are a minor.”。if
语句后面的条件表达式 age >= 18
会被计算,如果结果为真,则执行 if
后面的代码块;如果结果为假,则执行 else
后面的代码块。
for 循环
#include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
printf("The value of i is %d\n", i);
}
return 0;
}
这个 for
循环会从 0 开始,每次循环 i
的值加 1,直到 i
等于 5 时停止循环。for
循环的语法结构是 for (初始化; 条件; 迭代)
。初始化部分 int i = 0
用于初始化循环变量;条件部分 i < 5
用于判断是否继续循环;迭代部分 i++
用于更新循环变量的值。
while 循环
#include <stdio.h>
int main() {
int j = 0;
while (j < 5) {
printf("The value of j is %d\n", j);
j++;
}
return 0;
}
这个 while
循环会在 j
小于 5 时一直执行,每次循环结束后 j
的值加 1。while
循环的语法结构是 while (条件)
,只要条件表达式的值为真,就会一直执行循环体中的代码。
do-while 循环
#include <stdio.h>
int main() {
int k = 0;
do {
printf("The value of k is %d\n", k);
k++;
} while (k < 5);
return 0;
}
do-while 循环与 while 循环类似,但它会先执行一次循环体,然后再判断条件。如果条件为真,则继续循环;如果条件为假,则停止循环。在这个示例中,无论 k
的初始值是多少,循环体都会至少执行一次。
函数
函数是一段完成特定任务的代码块。在 C 语言中,函数可以分为库函数和用户自定义函数。库函数是由 C 语言标准库提供的,我们可以直接使用;用户自定义函数是我们自己编写的,用于实现特定的功能。以下是一个自定义函数的示例:
#include <stdio.h>
// 函数声明
int add(int a, int b);
int main() {
int num1 = 5;
int num2 = 3;
int result = add(num1, num2);
printf("The result of addition is %d\n", result);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
在这个示例中,我们定义了一个名为 add
的函数,它接受两个整数参数并返回它们的和。函数声明 int add(int a, int b);
告诉编译器有一个名为 add
的函数,它接受两个整数参数并返回一个整数。函数定义 int add(int a, int b) { return a + b; }
实现了函数的具体功能。在 main()
函数中调用了这个函数,并将结果输出。
数组
数组是一组相同类型的元素的集合。数组可以存储多个数据,并且可以通过索引来访问每个元素。以下是一个一维数组的示例:
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("The value at index %d is %d\n", i, numbers[i]);
}
return 0;
}
在这个示例中,我们声明了一个包含 5 个整数的数组 numbers
,并使用 for
循环遍历数组并输出每个元素的值。数组的索引从 0 开始,所以 numbers[0]
表示数组的第一个元素,numbers[1]
表示数组的第二个元素,以此类推。
多维数组
#include <stdio.h>
int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
}
}
return 0;
}
多维数组是数组的数组。这里我们定义了一个二维数组 matrix
,它可以看作是一个 2 行 3 列的矩阵。通过嵌套的 for
循环,我们可以遍历二维数组的每个元素。
指针
指针是 C 语言中一个非常重要的概念。指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以直接访问和修改内存中的数据。以下是一个指针的示例:
#include <stdio.h>
int main() {
int num = 10;
int *ptr = #
printf("The value of num is %d\n", num);
printf("The address of num is %p\n", &num);
printf("The value of ptr is %p\n", ptr);
printf("The value pointed to by ptr is %d\n", *ptr);
*ptr = 20;
printf("The new value of num is %d\n", num);
return 0;
}
在这个示例中,我们定义了一个整数变量 num
,并使用取地址运算符 &
获取它的地址。然后,我们定义了一个指针变量 ptr
,并将 num
的地址赋值给它。通过解引用运算符 *
,我们可以访问指针所指向的变量的值。我们还可以通过指针来修改所指向的变量的值,如 *ptr = 20;
这行代码将 num
的值修改为 20。