# 学习 C 编程语言

<https://www.w3schools.com/c/index.php>

C 语言创造于 1972 年，至今仍在广泛使用。学习 C 语言可以帮助我理解 Linux 内核。

## C 的 Hello World

```c
#include <stdio.h> // 头文件，用于引用需要的库文件

int main () { // 声明一个函数
  printf("Hello World!"); // ; 是每行语句必备的
}
```

## 插入新行

使用 \n，其他类似的用法 \t, \\, \"。

## 声明变量

- int
- float
- char 声明单字符

变量声明后，变量对应的值可被更改。

### 格式化输出

- %d 输出整数
- %f 输出小数，%.1f 输出一位小数
- %c 输出单个字母

例子：

```c
int studentId = 15;
int studentAge = 23;
float studentFee = 45.6;
char studentGrade = 'C';

printf("Student id: %d\n", studentId);
printf("Student age: %d\n", studentAge);
printf("Student fee: %f\n", studentFee);
printf("Student grade: %c", studentGrade);
```

## 数据类型

- 整型 2/4 字节 %d
- 浮点型 4 字节 %f/%F
- 双精度浮点 8 字节 %lf
- 字符型 1 字节 %c

还有个 %s 用于字符串。

科学记数法： `34e2` ， `23E5` 。

小数精度设置： `%.1f`

占用内存大小使用 sizeof 查看： `sizeof(variable)`

类型转换：显式和隐式

## 常量

使用 const 定义，定义时为了和变量区分，可以用大写

## 操作符

分类：算术、赋值、比较、逻辑、位。

## 布尔值

使用该类型需要导入库 stdbool.h 到头文件

使用 bool 定义布尔值

## 条件从句

- if..else..
- switch
- while..
- do..while..
- for
- break/continue

## 数组

```c
int dice[] = {1, 2, 3};
dice[0] = 4;
printf("%d", dice[0]);
```

```c
int myNumbers[] = {23, 45, 67};
int i;

for (i = 0; i < 3; i++) {
  printf("%d\n", myNumbers[i]);
}
```

```c
int myNumbers[3];

myNumbers[0] = 23;
myNumbers[1] = 22;
myNumbers[2] = 21;
```

```c
int array[] = {1, 2, 3};
printf("%lu", sizeof(array));
```

上面输出数组的字节大小，要想输出长度见下面代码。

```c
int array[] = {1, 2, 3};
int length = sizeof(array) / sizeof(array[0]);

printf("%d", length);
```

```c
int ages[] = {20, 22, 18, 35, 48, 26, 87, 70};

float avg, sum = 0;
int i;

int length = sizeof(ages) / sizeof(ages[0]);

for(i = 0; i < length; i++) {
  sum += ages[i];
}

avg = sum / length;

printf("The average age is: %.2f", avg);
```

```c
int ages[] = {20, 22, 18, 35, 48, 26, 87, 70};

float avg, sum = 0;
int i;

int length = sizeof(ages) / sizeof(ages[0]);
int lowestAge = ages[0];

for(i = 0; i < length; i++) {
  if (lowestAge > ages[i]) {
    lowestAge = ages[i];
  }
}
```

```c
int matrix[2][3] = { {1, 7, 9}, {7, 3, 1} };

int i, j;
for (i = 0; i < 2; i++) {
  for (j = 0; j < 3; j++) {
    printf("%d\n", matrix[i][j]);
  }
}
```
