C语言基础知识(1)

C语言基础知识(1)

1. 预处理

“#” 表示预处理, include 预处理指令,包含头文件

包含头文件的目的是为了声明,在编程中我们会定义很多名称,这些名称编译器不认识,所以需要声明。

  1. <> 在标准库中查找头文件,一般包含C语言提供的头文件
  2. " " 在我们指定的路径查找头文件,一般包含我们自己定义的头文件
#include <stdio.h> //这个就是一个头文件 
// std standard 标准 io input/output 指输入/输出缓存

2. 输入/输出缓存

缓存的目的是为了提升数据传输的效率
A将数据发给B,A可以不等待B接收数据,而是将数据放在缓存中,B在合适的去缓存中读取数据
在这里插入图片描述
在这里插入图片描述
一般常用的输入函数是scanf
一般常用的输出函数是printf

3. 基础运算

3.1 算术运算符

+、-、*、/、%(模除:求余数)
/ : 整数相除的整数,除不开舍得余数部分。10/4 2
只要除数和被除数中有一个是小数,那么就按照小数除法计算,小数相除得小数 10.0/4 2.5
除数不能为零,不是语法错误,但是回导致程序崩溃
%:只能用于整数运算,左右两个操作数只能是整数 10%7 3

真与假

C语言使用数字0表示假,所有的非0数都表示真,C语言默认用1表示真。所以关系运算符的运算结果是0或者1

3.2 关系运算符

相等运算符(==):用于比较两个操作数是否相等,如果相等则返回真(非零),否则返回假(0)。
不等运算符(!=):用于比较两个操作数是否不相等,如果不相等则返回真(非零),否则返回假(0)。
大于运算符(>):用于比较左操作数是否大于右操作数,如果是则返回真(非零),否则返回假(0)。
小于运算符(<):用于比较左操作数是否小于右操作数,如果是则返回真(非零),否则返回假(0)。
大于等于运算符(>=):用于比较左操作数是否大于等于右操作数,如果是则返回真(非零),否则返回假(0)。
小于等于运算符(<=):用于比较左操作数是否小于等于右操作数,如果是则返回真(非零),否则返回假(0)。

3.3 逻辑运算符

逻辑运算符的运算结果也是真1 假0

&& 逻辑与 ,都为真即为真,其余都是假
| | 逻辑或 ,一个为真,就是真;都为假,才是假
! 逻辑非,用于对一个布尔值或任何表达式进行逻辑取反操作,如果表达式的值为真,则取反后的值为假,如果表达式的值为假,则取反后的值为真。

3.4 单目运算符

单目运算符,只有一个操作数,只能对变量进行运算

++ 给变量自身的值+1
– 给变量自身的值-1
前缀形式的运算结果,是变量改变之后的值
后缀形式的运算,是变量改变之前的值

3.5 逗号运算

逗号表达式的算法,是最后一个逗号后面的值,所有的逗号都会执行,从左到右执行。

研究逗号表达式的算法没有实际的含义,但是笔试题容易考。

3.6 优先级

() 永远最高、单目 ! ++ --、算术运算、关系运算、逻辑运算、条件运算、赋值、逗号

4. 进制

在这里插入图片描述
在这里插入图片描述

5. 数据类型

int 占4个字节内存

char 字符 character 占1个字节内存
char的整数范围小于int char和int除了占内存大小不一样,其他用法都是一样的
如果 char 被定义为有符号的,那么它的范围通常是从 -128 到 127(包括)
如果 char 被定义为无符号的,那么它的范围通常是从 0 到 255(包括)
这意味着当你声明一个 char 类型的变量时,它可以存储 -128 到 127(或 0 到 255)之间的整数值。

short 或者short int 短整型(整数类型,占内存比int小)占2个字节,没有规定范围大小

float 单精度浮点型(7位有效数字)占4个字节,float 类型的精度通常约为 6~7 位有效数字

double 双精度浮点型(比float能表示数的范围更大,有效数字也更多,16位有效数字)占8字节,double 类型的精度通常约为 15~16 位有效数字,而 IEEE 754 标准定义了双精度浮点数的表示方式,其中包括了符号位、指数部分和尾数部分。

#include <stdio.h>

int main()
{
	char a = 'A'; //使用字符常量 'A' 给字符变量a 赋值
	a = a + 1;
	//%c 是以字符的形式打印整数
	printf("%c  %d\n", a , a ); //B   66
	return 0;
}
//**字符的本质就是整数**

将数字字符转成对应的整数

#include <stdio.h>
int main()
{
	char a = '9';
	int num = a - '0'; // '0' 就是48    num的值是9
	int num2 = a - 48;  // '0' 就是48    num2的值是9
	printf("%d %d\n", num ,num2);
	int b = '1';
	printf("%d\n", b-48); // 1
	return 0;	
}
// 要想得到数字字符的本事就需要    - '0'  或者- 48

内存的最小存数据的单位是bit,二进制位
1字节byte ========= 8bit
1kb ========= 1024byte
1mb ========= 1024kb
1gb ========= 1024mb
1tb ========= 1024gb

5.1 sizeof()

sizeof() 是一个运算符,用于计算数据类型或变量所占用的字节数。sizeof() 运算符的语法形式如下

sizeof(type)  

其中,type 可以是任何 C 语言数据类型(例如 int、float、double、char、数组、结构体等)。sizeof() 运算符返回一个 size_t 类型的值,表示 type 所占用的字节数。

类型占内存的大小,不会随着程序的进行而改变
sizeof()的运算结果是常量,其他的运算符得到都是变量。sizeof()在运算之前我们就知道结果。

sizeof()的作用是为了增强代码的可读性,并不仅仅是为了算出一个常量,常量本身没有意义。

int a = 42;
char b = 'A';
float c = 3.14;
double d = 3.14159265358979323846;
int array[10];
struct person {
  char name[20];
  int age;
};
struct person p;

printf("Size of int is %zu bytes\n", sizeof(int));
printf("Size of char is %zu bytes\n", sizeof(char));
printf("Size of float is %zu bytes\n", sizeof(float));
printf("Size of double is %zu bytes\n", sizeof(double));
printf("Size of array is %zu bytes\n", sizeof(array));
printf("Size of struct is %zu bytes\n", sizeof(struct person));
printf("Size of variable a is %zu bytes\n", sizeof(a));
printf("Size of variable b is %zu bytes\n", sizeof(b));
printf("Size of variable c is %zu bytes\n", sizeof(c));
printf("Size of variable d is %zu bytes\n", sizeof(d));
printf("Size of variable p is %zu bytes\n", sizeof(p));

输出:

Size of int is 4 bytes
Size of char is 1 bytes
Size of float is 4 bytes
Size of double is 8 bytes
Size of array is 40 bytes
Size of struct is 24 bytes
Size of variable a is 4 bytes
Size of variable b is 1 bytes
Size of variable c is 4 bytes
Size of variable d is 8 bytes
Size of variable p is 24 bytes

注意,在 sizeof() 运算符中,type 不需要用括号括起来。但是,通常建议在使用 sizeof() 运算符时使用括号,以避免一些运算符优先级问题。

6. 常用的格式控制符

%d:打印有符号十进制整数。
%u:打印无符号十进制整数。
%f:打印浮点数。
%c:打印单个字符。
%s:打印字符串。
%p:打印指针地址。
%x 或 %X:打印十六进制数,小写或大写字母(分别是 %x 和 %X)
%e 或 %E:用科学计数法打印浮点数,小写或大写字母(分别是 %e 和 %E)。
%g 或 %G:自动选择浮点数表示法(定点或科学计数法),小写或大写字母(分别是 %g 和 %G)。
%o:打印八进制数。
%li 或 %ld:打印长整型有符号整数。
%llu 或 %lu:打印无符号长整型整数。
%lld:打印长长整型有符号整数。
%%:打印一个百分号(%字符本身需要使用两个%字符来转义)。

以下是一些常用的标记:

-:在字段宽度前加上 - 号,表示左对齐。
0:在字段宽度前加上 0,表示在字段宽度不足时填充 0。
*:使用一个整数参数作为字段宽度或精度。例如,%*d 表示使用下一个整数参数作为字段宽度。
.:用于指定浮点数的精度,或者用于字符串中指定要打印的字符数。
例如,以下代码将打印一个宽度为 10 个字符的有符号整数,并且在字段宽度不足时填充 0:

int num = 42;
printf("The answer is %010d\n", num); //输出:The answer is 0000000042

7. 条件、循环语法

7.1 if 语句

f 语句用于根据一个条件来执行代码块。它的语法形式如下

if (condition) {
  // 满足条件时执行的代码
}

如果 condition 为真,那么代码块中的语句将被执行。否则,代码块将被跳过

7.2 if-else 语句

if-else 语句用于根据一个条件来执行两个不同的代码块。它的语法形式如下:

if (condition) {
  // 满足条件时执行的代码
} else {
  // 不满足条件时执行的代码
}

如果 condition 为真,那么第一个代码块中的语句将被执行。否则,第二个代码块中的语句将被执行。

7.3 if-else if-else 语句

if-else if-else 语句用于根据多个条件来执行不同的代码块。它的语法形式如下:

if (condition1) {
  // 满足条件1时执行的代码
} else if (condition2) {
  // 满足条件2时执行的代码
} else {
  // 不满足任何条件时执行的代码
}

如果 condition1 为真,那么第一个代码块中的语句将被执行。否则,如果 condition2 为真,那么第二个代码块中的语句将被执行。否则,第三个代码块中的语句将被执行。

7.4 switch 语句

switch 语句用于根据一个表达式的值来执行不同的代码块。它的语法形式如下:

switch (expression) { //表达式要求结果是整数类型   char  short  int
  case value1: //值是常量,是表达式可能产生的结果
    // expression 等于 value1 时执行的代码
    break; //执行到遇到break或者switch 结构结束为止
  case value2:  // case 可以写无数个,但是每个case后面的常量值不能相等
    // expression 等于 value2 时执行的代码
    break;
  default: //当表达式的结果没有匹配到任何一个case的值时,从default开始执行。可以,没有default
    // expression 不等于任何值时执行的代码
    break;
}

switch 语句先计算 expression 的值,然后将其与每个 case 语句中的值进行比较。如果 expression 等于某个值,那么对应的代码块将被执行。如果 expression 不等于任何值,那么 default 代码块将被执行。

switch-case结构完全可以被if-else结构代替,有一些分支结构的逻辑用switch-case结构写可读性更强、更优雅。

7.5 while 循环

while 循环用于在条件为真的情况下重复执行一段代码。它的语法形式如下:

while (condition) {
  // 满足条件时重复执行的代码
}

在每次循环迭代中,condition 将被计算并检查。如果 condition 为真,那么代码块中的语句将被执行。否则,循环将结束。
在这里插入图片描述

7.6 do-while 循环

do-while 循环类似于 while 循环,但它保证循环中的代码块至少被执行一次。它的语法形式如下:

do {
  // 执行一次的代码
} while (condition);

代码块中的语句将被执行一次,然后 condition 将被计算并检查。如果 condition 为真,那么代码块中的语句将被再次执行。否则,循环将结束。

7.7 for 循环

for 循环用于在特定条件下重复执行一段代码,通常用于遍历数组或执行固定次数的循环。它的语法形式如下:

for (initialization; condition; increment) {
  // 满足条件时重复执行的代码
}

for 循环由三个部分组成:初始化(initialization)、条件(condition)和增量(increment)。在循环开始时,初始化语句将被执行一次。然后,condition 将被计算并检查。如果 condition 为真,那么代码块中的语句将被执行。然后,increment 语句将被执行,然后 condition 将再次被计算并检查。这个过程将重复执行,直到 condition 不再为真。

总结

不同循环适合表达不同的逻辑
while 适合不以循环的次数作为循环条件的循环。
for 适合以循环次数作为循环条件的循环。
do-while 校验循环体的执行结果,根据对结果的预期决定是否需要循环。
使用哪一种表达逻辑更清晰就用哪一种。
在这里插入图片描述

8. 编译

在命令行中编译 C 语言程序,需要使用 C 语言编译器(例如 GCC 或 Clang)
使用 C 语言编译器编译程序。以 GCC 为例,可以使用以下命令编译程序:

gcc -o hello hello.c

其中,-o 选项用于指定输出文件的名称,hello.c 是程序源代码文件的名称,hello 是编译后的可执行文件的名称。如果编译没有错误,那么将会在当前目录下生成一个名为 hello 的可执行文件。

运行程序
在命令行中输入以下命令来运行程序:

./hello

这将执行编译后生成的可执行文件。

需要注意的是,编译 C 语言程序时,需要在编译命令中包含所需的库文件或头文件。这些文件可以使用 -I 或 -L 选项来指定搜索路径,使用 -l 选项来指定库文件名称。

例如,如果程序中使用了 math.h 头文件中的数学函数,那么可以使用以下命令编译程序:

gcc -o program program.c -lm

其中,-lm 选项用于链接 math 库文件。

8.1 gcc 常用命令

GCC 是 GNU Compiler Collection 缩写的简称,是一个开源的 C/C++/Objective-C 等语言的编译器集合。GCC 支持多种编译器架构和操作系统平台,包括 Linux、macOS、Windows 等。以下是一些常用的 GCC 编译器选项及用法:

  1. 编译 C 语言程序
    使用 GCC 编译 C 语言程序的命令格式为:
gcc [options] file.c -o executable

其中,-o 选项用于指定编译生成的可执行文件的名称,file.c 是源代码文件的名称,executable 是可执行文件的名称。常用的编译选项包括:

-c:编译源代码文件,生成目标文件,不进行链接操作。
-g:编译时生成调试信息,方便在调试程序时进行跟踪。
-Wall:打开所有警告信息,方便发现代码中的潜在问题。
-O:进行优化操作,提高程序的执行效率。
-I:指定头文件的搜索路径。
-L:指定库文件的搜索路径。
-l:指定需要链接的库文件。

  1. 编译 C++ 程序
    GCC 也可以用来编译 C++ 程序。编译 C++ 程序的命令格式与编译 C 语言程序的命令格式类似,只需要将源代码文件的扩展名从 .c 更改为 .cpp 或 .cxx。例如,以下命令编译名为 hello.cpp 的 C++ 程序并生成可执行文件 hello:
g++ -o hello hello.cpp
  1. 使用静态库和动态库
    GCC 支持静态库和动态库的编译和链接。静态库是将多个目标文件打包成一个文件,链接时将库文件的代码复制到可执行文件中。而动态库是在程序运行时动态地加载,并且可以在多个程序之间共享。常用的选项包括:

    • static:使用静态库链接。
    • shared:生成动态库。
    • fPIC:生成位置无关代码。

    例如,以下命令编译名为 example.c 的程序并链接静态库 libfoo.a:

gcc -o example example.c -L. -lfoo

其中,-L. 选项指定在当前目录中搜索库文件,-lfoo 选项指定链接名为 libfoo.a 的库文件。

  1. 交叉编译
    GCC 还支持进行交叉编译,即在一种操作系统平台上编译生成另一种操作系统平台上的可执行文件。常用的选项包括:

    • target:指定目标操作系统和架构。
    • march:指定生成的目标机器代码的架构。
    • mabi:指定生成的目标机器代码的 ABI。

    例如,以下命令将在 Linux 平台上编译生成一个运行在 ARM 架构的可执行文件:

gcc -o hello_arm -target arm-linux-eabi hello.c
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力跟上的码农小酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值