人生漫长。开始学就行,慢慢就越学越好
#include
#include是一个预处理命令,用于包含或插入指定头文件的内容到当前位置。这个命令 告诉编译器在实际编译之前需要做的工作。使用#include可以将头文件的内容插入到源文 件中,使得函数声明或宏定义可以在多个文件之间共享。
- #include <stdio.h>
- #include "myHeader.h"
在上述代码中,<stdio.h>是标准输入输出头文件,而"myHeader.h"是用户自定义的头文件。使用尖括号<>和双引号""有不同的搜索路径。尖括号告诉编译器在系统路径下查找头文件,而双引号则首先在当前目录下查找,如果未找到,再在系统路径下查找1。
#define
在C语言中,#define指令是一种预处理命令,用于创建宏定义,这些宏定义可以是常量、表达式、代码片段甚至是基于条件的编译指令。#define指令的主要优点是它不占用内存空间,因为它只是一个临时的符号,预编译后这个符号就不存在了。
基本用法
#define的基本语法如下:
#define 标识符 常量(宏定义的内容)
这里的标识符是宏的名称,常量可以是数字、字符、字符串或表达式。例如:
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))
在这些例子中,PI是一个代表圆周率的宏,而MAX是一个带参数的宏,用于计算两个值中的最大值。
宏的替换规则,预处理器会将程序中所有出现宏名称的地方替换为宏定义的内容。这个过程称为宏展开。例如,如果你在代码中使用PI,预处理器会将其替换为3.14159。
宏与函数的区别,虽然宏可以像函数一样使用,但它们之间有几个关键区别:
-
宏在每次使用时都会在程序中插入一份代码,这可能会增加程序的长度。
-
宏不进行类型检查,因此它们是类型无关的,可以用于任何合法的参数类型。
-
宏可能会引起运算符优先级的问题,因此建议在宏定义中多使用括号。
struct
参考链接:struct 结构 - 《阮一峰《C 语言教程》》 - 书栈网 · BookStack
允许自定义复合数据类型,将不同类型的值组合在一起。这样不仅为编程提供方便,也有利于增强代码的可读性。C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。
下面是struct
自定义数据类型的一个例子,然后声明该类型的变量。
声明了一个struct fraction
类型的变量f1
,这时编译器就会为f1
分配内存,接着就可以为f1
的不同属性赋值。
struct fraction {
int numerator;
int denominator;
};
struct fraction f1;
声明f1.numerator = 22;
赋值。f1.denominator = 7;
赋值。
struct 的数据类型声明语句与变量的声明语句,可以合并为一个语句。
struct book {
char title[500];
char author[100];
float value;
} b1;
上面的语句同时声明了数据类型book
和该类型的变量b1
。如果类型标识符book
只用在这一个地方,后面不再用到,这里可以将类型名省略。
指针变量也可以指向struct
结构。
// 常写成两个语句
struct book {
char title[500];
char author[100];
float value;
};
struct book* b1;
上面示例中,变量b1
是一个指针,指向的数据是struct book
类型的实例。
函数
函数是一段可以重复执行的代码。它可以接受不同的参数,完成对应的操作。下面的例子就是一个函数。
int plus_one(int n) {
return n + 1;
}
上面的代码声明了一个函数plus_one()
。
函数声明的语法有以下几点,需要注意。
(1)返回值类型。函数声明时,首先需要给出返回值的类型,上例是int
,表示函数plus_one()
返回一个整数。
(2)参数。函数名后面的圆括号里面,需要声明参数的类型和参数名,plus_one(int n)
表示这个函数有一个整数参数n
。
(3)函数体。函数体要写在大括号里面,后面(即大括号外面)不需要加分号。大括号的起始位置,可以跟函数名在同一行,也可以另起一行,本书采用同一行的写法。
(4)return
语句。return
语句给出函数的返回值,程序运行到这一行,就会跳出函数体,结束函数的调用。如果函数没有返回值,可以省略return
语句,或者写成return;
。
调用函数时,只要在函数名后面加上圆括号就可以了,实际的参数放在圆括号里面,就像下面这样。
int a = plus_one(13);
// a 等于 14
for 循环
for
语句是最常用的循环结构,通常用于精确控制循环次数。
1.一般形式为:
for(单次表达式;条件表达式;末尾循环体)
{
中间循环体;
}
for (initialization; continuation; action)
statement;
上面代码中,for
语句的条件部分(即圆括号里面的部分)有三个表达式。
initialization
:初始化表达式,用于初始化循环变量,只执行一次。continuation
:判断表达式,只要为true
,就会不断执行循环体。action
:循环变量处理表达式,每轮循环结束后执行,使得循环变量发生变化。
循环体部分的statement
可以是一条语句,也可以是放在大括号里面的复合语句。下面是一个例子。
for (int i = 10; i > 0; i--)
printf("i is %d\n", i);-------
一条语句
执行过程为:
- 求解表达式1;
- 求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步;
- 求解表达式3;
- 转回上面第2步继续执行;
- 循环结束,执行 for 语句下面的语句。
执行过程中,“表达式1”只执行一次,循环是在“表达式2”“表达式3”和“内嵌语句”之间进行的。
变量
变量名区分大小写,star
、Star
、STAR
都是不同的变量。
并非所有的词都能用作变量名,有些词在 C 语言里面有特殊含义(比如int
),另一些词是命令(比如continue
),它们都称为关键字,不能用作变量名。
C 语言的变量,必须先声明后使用。如果一个变量没有声明,就直接使用,会报错。
每个变量都有自己的类型(type)。声明变量时,必须把变量的类型告诉编译器。
int height;
上面代码声明了变量height
,并且指定类型为int
(整数)。
变量的声明和赋值,也可以写在一行。多个相同类型变量的赋值,可以写在同一行。
int num = 42;
int x = 1, y = 2;
多重赋值表达式。一次为多个变量赋值。赋值运算符是从右到左执行,所以先为n
赋值,然后依次为m
、z
、y
和x
赋值。
int x, y, z, m, n;
x = y = z = m = n = 3;
typedef
typedef
命令用来为某个类型起别名。
typedef type name;
- typedef float float32_t;
float
类型占用4个字节(32位),其中8位存放指数的值和符号,剩下24位存放小数的值和符号。
上面代码中,type
代表类型名,name
代表别名。