C语言学习笔记-基本语法(一)

C
5.7k 词

一、注释

1.1 单行注释

  • 位置:可放在代码后,称之为行尾注释; 也可放代码上一行,称作行上注释。
1
// 这是单行注释文字

1.2 多行注释

  • 语法:/* 待注释的内容 */
  • 注意:多⾏注释内,可以嵌套单⾏注释。 多⾏注释之间不能嵌套。
1
2
3
4
5
6
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
注意:多行注释不能嵌套使用。

1.3 注释的小扩展

  • 注释的快捷键:Ctrl + K,Ctrl + C/U
  • 注释擦除:注释的内容,不参与运行
  • 注释的嵌套:不管是单行还是多行,最好都不要嵌套

二. 常量

2.1 什么是常量

​ 程序运行的过程中,其值永远不会发生改变的数据

2.2 常量的分类

常量

2.3 输出常量

利用printf集合占位符的方式可以输出常量

格式:

​ printf(参数1,参数2);

​ 参数1:输出内容的最终样式,以字符串的形式体现 (必填)

​ 参数2:填补的内容 (选填)

占位符:

占位符 说明
整形 %d
实型 %f
字符 %c
字符串 %s

2.4 输出多个常量

一个printf中可以同时输出多个数据,占位符和后面的数据要一一对应

2.5 输出并换行

操作系统 换行符
windows \r\n
mac \r
Linux \n

平时写代码的时候,想要换行直接写\n即可,C语言会根据不同的操作系统解析成对应的换行符

三.变量

3.1 变量的三要素

  1. 变量名:用来在程序中使用。
  2. 变量类型:开辟内存空间大小。
  3. 变量值:存储的实际数据

3.2 变量定义:

​ 类型名 变量名 = 变量值(一般都这么写)

​ 举例:

​ int m = 57;

会开辟内存空间给变量。变量声明不会开辟内存空间。

3.3 变量的注意事项

  • 只能存一个值
  • 变量名不允许重复定义
  • 一条语句可以定义多个变量
  • 变量在使用之前一定要进行赋值
  • 变量的作用域范围

四.数据类型

4.1sizeof 运算符

目标:会查看变量、类型占用内存大小

​ 每种数据类型,都有自己固定的占用内存大小和取值范围。具体展开讲解前,我们先来看下,C 语言提供的查看变量或类型占用内存大小的运算符,sizeof。

  • 语法 1:sizeof(变量名)

    1
    2
    3
    int a = 10;
    printf("%llu\n", sizeof(a));//sizeof(a) 获取 a 变量占用内存大小。可以用 printf 显示出来
    // 查看 sizeof 返回的占用内存大小,需要使用 %llu 格式符
  • 语法 2:sizeof(类型名)

    1
    printf("%llu\n", sizeof(double)); // 也可以使用 sizeof 直接查看某种类型占用的内存大小

4.2数值型

4.2.1 整型

数据类型 字节数 格式符 数据范围 最小值宏 最大值宏
short(短整型) 2 %hd -215 ~ 215-1 (-32768 ~ 32767) SHRT_MIN SHRT_MAX
int(整型) 4 %d -231 ~ 231-1 (-2147483648 ~ 2147483647) INT_MIN INT_MAX
long(长整型) 4 %ld -231 ~ 231-1 (-2147483648 ~ 2147483647) LONG_MIN LONG_MAX
long long(长长整型) 8 %lld -263 ~ 263-1 LLONG_MIN LLONG_MAX
unsigned short(无符号 短整型) 同 short %hu 0 ~ 216-1 (0 ~ 65535) 0 USHRT_MAX
unsigned int(无符号 整型) 同 int %u 0 ~ 232-1 (0 ~ 4294967295) 0 UINT_MAX
unsigned long(无符号 长整型) 同 long %lu 0 ~ 232-1 (0 ~ 4294967295) 0 ULONG_MAX
unsigned long long(无符号 长长整型) 同 long long %llu 0 ~ 264-1 0 ULLONG_MAX

上表中列出的占用字节数和取值范围,是大多数情况下各种类型的取值。

由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。

比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。

再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。

可以使用 sizeof 查看 数据类型 占用内存的大小。

可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。

4.2.2 bool型

目标:知道 bool 类型两种取值

​ C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。

​ 但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。用 true 来代表 1,为真;用 false 来代表 0,为假。使用时,需要引入头文件 #include <stdbool.h>

4.2.3 实型

​ 实型表示有符号的十进制小数,在计算机内部以浮点方式表示(小数点是浮动的),因此也叫浮点型。

​ 常见实型有两种: float (单精度)、 double (双精度)

​ 实型数据没有八、十六进制,也没有 unsigned 无符号形式。在计算机底层采用的是近似计算,实现比较复杂,且不同平台处理方式不同。我们这里只学习它基本的知识。

类型 字节数 格式符 有效数字 常量后缀
float (单精度) 4 %f 6~7 f
double (双精度) 8 %lf 15~16

4.2.4 字符型

​ C 语言定义 char 类型来表示字符数据。 其本质依然是存储数值,因此与数值型类似,也有有符号、无符号之分。占用 1 个字节内存大小。

类型 字节数 格式符 数据范围 最小值宏 最大值宏
char 1 %hhd -27 ~ 27-1 (-128 ~ 127) CHAR_MIN CHAR_MAX
unsigned char 1 %hhu 0~28-1 (0 ~ 255) 0 UCHAR_MAX

4.3ASCII 码

​ char 类型在程序中,最常用来表示字符。其本质依然是一个数字,但每个值都对应一个固定的字符,共定义了128个字符。称之为 ASCII 码 (American Standard Code for Information Interchange) 美国信息交换标准代码。

ASCII值 控制字符 ASCII值 字符 ASCII值 字符 ASCII值 字符
0 NUL 32 (space) 64 @ 96
1 SOH 33 ! 65 A 97 a
2 STX 34 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DCI 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 \ 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 ~
31 US 63 ? 95 _ 127 DEL

​ 上表中有 6 个字符对应的 ASCII 较为常见,建议大家记下,会为后续写代码提供很多方便。

字符 ASCII 码 字符 ASCII 码
0 ‘\n’ 10
空格 32 0 48
A 65 a 97

​ 需注意的是,我们从键盘键入的所有内容都是字符。如,键入数字 7,实际是字符 ‘7’,真正存储在计算机内的是 55(字符 7 的 ASCII 码值),而如果我们键入了 35,实际上这是两个字符。真正存储在计算机内的是 51 和 53(字符 3 和 字符 5 的 ASCII 码值)。

​ 我们可以用 printf 结合 格式符 %c,显示字符。 如果用 %d,就显示 其 ASCII 值了。

4.4转义字符

C 语言提供了一类特殊的字符,是由 \ 和特定字符组合而成,称之为 转义字符。他们都是 ==一个== 字符,如:

  • ‘\n’ 这是 1 个字符。 代表 回车换行(回车键)。
  • ‘\t’ 也是 1 个字符。代表 制表符 (Tab键)。
  • ‘\b’ 同样是 1 个字符。 代表 退格符(Backspace 键)。
  • ‘\0’ 是一个字符。代表 空。对应 ASCII 值 0。
  • ‘\ddd’ 是一个字符。ddd 对应 3 个八进制数(没有用 0 开头)。 如:\141 对应 ASCII 值为 97,代表 ‘a’。
  • ‘\xhh’ 是一个字符。x 表十六进制,hh 对应 2 个十六进制数。 如:\x41 对应 ASCII 值为 65,代表 ‘A’。

\ 还可以在特定环境下,将一个字符还原其本身意。

比如,现在想在 printf(“%d\n”,10);输出 10 的时候,用 “” 把 10 包裹住。 如果直接写 printf(“ “%d” \n”,10);是会报错的。这时,可以使用 \" 将 “ 进行转义,还原其本身意。

4.5字符输入输出

C 语言提供了专门的函数,方便在程序中 获取、输出 字符数据。

  • getchar():获取用户从键盘写入的一个字符。

    1. 程序执行到 getchar() 会暂停,等待用户键入字符数据。
    2. 一次 getchar() 调用,只读取一个字符。如用户键入多个字符,需要多次调用 getchar()读取。
    3. 函数调用完成,会返回实际读到的字符 对应的 ASCII 值。
    4. 用户键入字符结束,敲的回车键,对应‘\n’ 字符,也可以使用 getchar() 读取。
    1
    int ret = getchar();
  • putchar(ch):将 ch 对应的字符,输出到屏幕。

    1. ch 可以是变量也可以是常量。
    2. 一次 putchar() 调用,只写出一个字符(不含换行符 ‘\n’)。
    3. 函数调用完成,会返回实际写出的字符 对应的 ASCII 值。
    1
    2
    char ch = 'A';
    int ret = putchar(ch);

五.scanf 输入

目标:接收用户输入数据

​ 我们可以借助 getchar() 读取用键入的字符数据。 如果想要读取其他数据怎么办呢?C语言提供了 scanf() 函数,可以结合 格式符 读取各种类型数据。

  • 作用:从标准输入设备(键盘)上按格式获取数据。

  • 语法:scanf(“格式控制字符串“, ……); 需指定头文件 #include <stdio.h>

    • 参 1: 必须是字符串,且必须包含 格式说明符(占位符)
      • 格式符 与 数据类型中使用方式一致。 常用的有 %d、%c、%f、%lf 等。
    • 后续参数(变参):个数,直接受 参 1 格式匹配符影响。
      • 对应 格式符的 必须是 变量地址(&变量名,可取变量地址),代表数据存放位置。
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    printf(“请输入一个字符:”);	// 借助 printf 提示用户输入
    char ch = 0; // 准备变量,存储数据
    scanf("%c", &ch); // 使用变量地址,与 格式符对应

    printf(“请输入三个整数,用逗号间隔:”);
    int a, b, c; // 可以不赋初值。
    scanf("%d,%d,%d", &a, &b, &c);

5.1 注意事项

  1. 不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。

  2. 键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。

  3. 键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。

  4. scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)

  5. VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。

    但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。

    • 方法 1:在项目中设置:工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中
    • 方法 2:在每个.c文件开头(第一行)添加宏:#define _CRT_SECURE_NO_WARNINGS

六.类型转换

6.1隐式类型转换

  1. 编译器自动完成。 (小类型转大类型,同类型大小)

    image-20250819103342794

  2. 由赋值产生。

1
2
3
4
int r = 3;
float s = 3.14 * r * r;
// 3.14 默认类型double, r 为int类型。运算过程中,转换为 double 类型运算。
// 运算结束,赋值给 s 时,转换为 float。

小类型 ——> 大类型: 没问题。
大类型 ——> 小类型。可能丢失数据。
VS中 Ctrl+F7 只编译,检查语法错误,不运行。

1
2
3
4
5
6
7
int main(void)
{
int a = 321;
char ch = a; // 用值为 321 的a变量,给 char 类型赋值。
printf("ch = %d\n", ch); // 运行输出 65;
return EXIT_SUCCESS;
}

321: 28 = 256 有, 128 没有, 64 有, 32/16/8/4/2 没有, 有1
0000 0000 0000 0000 0000 0001 0100 0001 —— 321 二进制表现形式。
0000 0000 —— char 只有一个字节。
赋值后,char值为:0100 0001 — 1 + 64 = 65

6.2强制类型转换

语法:

  1. 强转变量: (目标类型)变量
  2. 强转表达式:(目标类型)表达式
1
2
3
4
5
6
7
8
9
10
int main(void)
{
float price = 3.6; // 单价
int weight = 4; // 斤数
//int sum = weight * (int)price; // 强转变量。
//printf("sum = %d\n", sum); // --- 12
int sum = (int)(weight * price); // 强转表达式。
printf("sum = %d\n", sum); // --- 14
return EXIT_SUCCESS;
}

笔记来源:黑马程序员;菜鸟教程

留言