【C语言】第一期——数据类型&变量&常量

目录

[1 字面量](#1 字面量)

[2 整数类型](#2 整数类型)

[2.1 整数类型的取值范围](#2.1 整数类型的取值范围)

[2.1.1 sizeof 运算符](#2.1.1 sizeof 运算符)

[2.2 GB、MB、KB、B之间的关系](#2.2 GB、MB、KB、B之间的关系)

[2.3 定义整数类型的变量并打印](#2.3 定义整数类型的变量并打印)

[2.4 整数类型代码演示](#2.4 整数类型代码演示)

[3 浮点类型](#3 浮点类型)

[3.1 浮点类型的取值范围](#3.1 浮点类型的取值范围)

[3.2 定义浮点类型变量并打印](#3.2 定义浮点类型变量并打印)

[3.3 保留2位小数点](#3.3 保留2位小数点)

[4 char字符型](#4 char字符型)

[4.1 char类型的取值范围](#4.1 char类型的取值范围)

[4.2 ASCII码表(了解)](#4.2 ASCII码表(了解))

[4.3 C语言中的字符串](#4.3 C语言中的字符串)

[4.3.1 %s 用户字符串的输出](#4.3.1 %s 用户字符串的输出)

[5 C语言中的变量和常量](#5 C语言中的变量和常量)

[5.1 变量](#5.1 变量)

[5.1.1 一次定义多个变量](#5.1.1 一次定义多个变量)

[5.2 常量](#5.2 常量)

[5.2.1 字符常量 (转义字符)](#5.2.1 字符常量 (转义字符))

[5.2.2 const 和 #define 定义常量(重要)](#define 定义常量(重要))

[5.2.2.1 #define 预处理器定义常量](#define 预处理器定义常量)

[5.2.2.2 const 关键字定义常量](#5.2.2.2 const 关键字定义常量)

[5.2.2.3 #define 与 const 区别](#define 与 const 区别)

[6 C语言中标识符的命名规则以及注释](#6 C语言中标识符的命名规则以及注释)

[6.1 标识符的命名规则](#6.1 标识符的命名规则)

[6.2 C语言关键字](#6.2 C语言关键字)

[6.3 C语言的注释](#6.3 C语言的注释)

[7 C语言中printf与数据类型占位符](#7 C语言中printf与数据类型占位符)


C 中的类型可分为以下几种:

类型名称 描述
基本数据类型 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。
枚举类型 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
void 类型 类型说明符 void 表示没有值的数据类型,通常用于函数返回值。
派生类型 包括数组类型、指针类型和结构体类型。

这里我们首先给大家讲解一下基本数据类型,后期教程会详细讲解一下其他类型,在全部更新完后,会在此页面标记相应期数


1 字面量

在C语言中,字面量是一种不可变的数据类型,通过字面量可以存储数字、字符、布尔值和其他特殊值,如文件路径、日期和时间等 。

C语言中字面量主要分为下面几种:

❗注意:字符型是单引号,字符串是双引号

类型 示例 格式符(占位)
整型 100、314、0、-200 %d
浮点型 3.14、12.2、0.618、-1.7 %f
字符型 'a'、'1'、'='、'?'、'#' %c
字符串 "124"、"hello"、"www.qq.com" %s

2 整数类型

2.1 整数类型的取值范围

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 4 字节 -2,147,483,648 到 2,147,483,647
unsigned int 4 字节 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

❗注意:char 类型是否有符号取决于编译器和系统。

有些编译器将 char 视为 signed char,而有些则将其视为 unsigned char。

如果编译器将 char 视为 signed char:其取值范围就是 -128 到 127。

如果编译器将 char 视为 unsigned char:其取值范围就是 0 到 255。

各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。


2.1.1 sizeof 运算符

为了得到某个类型或某个变量在特定平台上的准确大小,可以使用 sizeof 运算符得到对象类型的存储字节大小。

表达式:sizeof(type)

下面的实例演示了获取 int 类型的大小:

cpp 复制代码
#include <stdio.h>

 int main()
 {
     printf("int 存储大小 : %d 个字节\n", sizeof(int));
     return 0;
 }

2.2 GB、MB、KB、B之间的关系

单位名称 英文全称 与下一级单位换算关系
比特 bit -
字节 byte 1B = 8 bit
千字节 Kilobyte 1KB = 1024B
兆字节 Megabyte 1MB = 1024KB
吉字节 Gigabyte 1GB = 1024MB

1bit=8位 00000 00000 ~ 1111 11111


2.3 定义整数类型的变量并打印

变量:顾名思义就是可以改变的量。变量本质上是一块有名字的内存空间,用来存放数据。

C语言中变量可以定义的时候赋值,也可以先定义后赋值

下面定义了一个int类型的变量 a,并且给a赋值了200

cpp 复制代码
 #include<stdio.h>

 int main()
 {
     int a = 200;
     printf("%d\n", a);
     return 0;
 }

下面首先定义了一个int类型的变量 a,然后给a赋值了200

cpp 复制代码
#include <stdio.h>

 int main()
 {
     int a;
     a = 200;
     printf("%d\n", a);
     return 0;
 }

2.4 整数类型代码演示

cpp 复制代码
#include <stdio.h> 

int main() {
    int a = 65;
    printf("a的值:%d\n", a);
    short b = 2;
    printf("b的值:%d\n", b);
    long c = 12345;
    printf("c的值:%d\n", c)
    unsigned short s = 12;
     printf("int 占用%d个字节\n", sizeof(int));
     printf("short 占用%d个字节\n", sizeof(short));
     printf("long 占用%d个字节\n", sizeof(long));
     printf("s的值:%d\n", s);
     return 0;
 }

输出结果:

a的值:65

b的值:2

c的值:12345

int 占用4个字节

short 占用2个字节

long 占用4个字节

s的值:12


3 浮点类型

3.1 浮点类型的取值范围

下表列出了关于标准浮点类型的存储大小、值范围和精度的细节

类型 存储大小 值范围 精度
float 4 字节 1.2E-38 到 3.4E+38 6 位有效位
double 8 字节 2.3E-308 到 1.7E+308 15 位有效位
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位有效位

头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。

下面的实例将 输出浮点类型占用的存储空间以及它的范围值:

3.4E+38表示的意思是 3.4*10^38


3.2 定义浮点类型变量并打印

示例1:通过float定义一个浮点数

cpp 复制代码
#include <stdio.h>

 int main()
 {
     float f = 3.14f;
     printf("%f\n", f);
     return 0;
 }

注意: float定义浮点数的时候,在数值后面需要加上f, 如果不加F,系统会默认把赋值的数字当作 double类型处理 ,然后在把这个double类型的值赋给float类型,这样就会出现精度丢失。

示例2:通过double定义一个浮点数

cpp 复制代码
#include<stdio.h>

 int main()
 {
     double d = 3.14;
     printf("%lf\n", d);
     return 0;
 }

示例3:float 以及double占用的字节数

cpp 复制代码
#include <stdio.h>

 int main()
 {
     printf("float 存储最大字节数 : %d \n", sizeof(float));
     printf("double 存储最大字节数 : %d \n", sizeof(double));
     return 0;
 }

输出结果:

float 存储最大字节数 : 4

double 存储最大字节数 : 8


3.3 保留2位小数点

cpp 复制代码
#include <stdio.h>

 int main()
 {
     float a = 3.1415f;
     printf("%.2f", a);
     return 0;
 }
cpp 复制代码
#include <stdio.h>

 int main()
 {
     double d = 3.14135;
     printf("%.2lf\n", d);
     return 0;
 }

输出结果:

3.14


4 char字符型

C语言中,字符型只有一种:字符型(char)。char占用1个字节

C 语言中,char 类型既可以当作整数类型使用,也可以当作字符类型使用

4.1 char类型的取值范围

下表列出了字符型的存储大小和值范围的细节:

存储大小 类型 值范围
1 字节 char -128 到 127 或 0 到 255
1 字节 unsigned char 0 到 255

如果想要明确指定有符号或无符号的字符类型,可以分别使用 signed char 和 unsigned char,这样在不同编译器下取值范围就确定了。
char字符类型数据在printf函数中一般采用c%格式进行输出

cpp 复制代码
#include<stdio.h>

 int main()
 {
     char c = 'A';
     printf("%c\n", c);  
     return 0;
 }

分析:

1.执行第 4 行程序时,先在内存中开 1字节空间,并标记为c,然后把字符A对应的ASCII码65,存储在c 标记的内存空间中。

2.执行第5行程序时,先读取变量c对应内存空间中的数据 65,然后替换 printf中的c,由于%c表示字符格式,因此不能直接输出整数65,而是输出65对应的字符A。

字符在内存中是按照其对应的 ASCII码进行存储,而ASCII码本质上也是整数。因此,字符型可以看作是整型的一种,当然也就可以按照 %d格式输出。

下面通过程序了解一下:

cpp 复制代码
#include <stdio.h>

 int main()
 {
     char c = 'A';
     printf("%c\n", c);
     printf("%d\n", c);
     return 0;
 }

输出结果:

A

65


4.2 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 TAB 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 DC1 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 ETB 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

4.3 C语言中的字符串

在 C 语言中是没有字符串类型的,所谓的字符串本质上是由单个字符组成。

例如:

" USER_A001", 可以看做是由字符 'U'、'S'、'E'、'R'、'_'、'A'、'0'、'0'、'1'组成

cpp 复制代码
#include <stdio.h>

 int main()
 {
     printf("我的名字是:%s", "USER_A001");
     return 0;
 }

4.3.1 %s 用户字符串的输出

在 C 语言中字符串实际上是使用空字符 \0 结尾的一维字符数组。

因此,\0 是用于标记字符串的结束。

cpp 复制代码
#include <stdio.h>

 int main()
 {
     char name[10] = { 'U', 'S', 'E', 'R', '_', 'A', '0', '0', '1', '\0'};
     printf("我的姓名是:%s", name);
     return 0;
 }

5 C语言中的变量和常量

5.1 变量

变量是在程序运行过程中其值可以改变的量。

上文中的 char int float double定义的数据都是变量。

cpp 复制代码
#include <stdio.h> 
int main() {
    //整型
    int a;    //声明
    a = 123;    //初始化赋值
    a = 456;    //修改值

    int b = 123;    //声明完直接赋值
    
    //浮点型
    float c;
    c = 3.14f;
    c = 3.14159f;

    float c = 3.14f;

    return 0;
 }

5.1.1 一次定义多个变量

cpp 复制代码
#include <stdio.h>

 int main()
 {
     int a = 100, b = 200; // 定义int 变量 a、 b 且赋值
     int c = 300;          
     // 定义变量 c 且赋值
     int d = 400;          
     printf("a=%d\n", a);
     printf("b=%d\n", b);
     printf("c=%d\n", c);
     printf("d=%d\n", d);
     return 0;
 }

5.2 常量

常量是指在程序执行过程中其值不能改变的量。

在 C语言中支持整型常量、浮点型常量、字符型常量和字符串型常量。

上文讲的字面量就属于常量

5.2.1 字符常量 (转义字符)

在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符 (\n)或制表符(\t)等。

转义序列1 含义1 转义序列2 含义2
\\ \字符 \' '字符
\" "字符 \? ?字符
\a 警报铃声 \b 退格键
\f 换页符 \n 换行符
\r 回车 \t 水平制表符
\v 垂直制表符 \ooo 一到三位的八进制数
\xhh... 一个或多个数字的十六进制数
cpp 复制代码
#include <stdio.h> 

int main() {
    printf("C:\Windows\System32\n"); //错误写法
    printf("C:\\Windows\\System32"); // 正确写法
    return 0;
 }

5.2.2 const 和 #define 定义常量(重要)

在 C 中,有两种简单的定义常量的方式:

  1. 使用 #define 预处理器: #define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。
5.2.2.1 #define 预处理器定义常量

在C语言中,#define命令可以用于创建宏定义。宏定义是在编译时直接替换源文件中的字符串,而不 是在运行时替换它们 。
下面是使用 #define 预处理器定义常量的形式:

❗注意:宏定义后边不要加分号

cpp 复制代码
#define 常量名 常量值

下面的代码定义了一个名为 PI 的常量:

在程序中使用该常量时,编译器会将所有的 PI 替换为 3.14159

cpp 复制代码
#define PI 3.14159

实例:

cpp 复制代码
 #include <stdio.h>

 #define LENGTH 10   
 #define WIDTH  5
 #define NEWLINE '\n'
 
 int main()
 {
     int area;  
     area = LENGTH * WIDTH;
     printf("value of area : %d", area);
     printf("%c", NEWLINE);
     return 0;
 }

运行结果:value of area : 50


5.2.2.2 const 关键字定义常量

可以使用 const 前缀声明指定类型的常量,如下所示:

❗注意,把常量定义为大写字母形式,是一个很好的编程习惯。

cpp 复制代码
const 数据类型 常量名 = 常量值;

下面的代码定义了一个名为MAX_VALUE的常量:

在程序中使用该常量时,其值将始终为100,并且不能被修改。

cpp 复制代码
const int MAX_VALUE = 100;

❗注意:const 声明常量要在一个语句内完成

错误写法:

const int var;

const int var;

var=5;

正确写法:

const int var = 5;

实例:

cpp 复制代码
 #include <stdio.h>

 int main() 
 {
    const int  LENGTH = 10;
    const int  WIDTH  = 5;
    const char NEWLINE = '\n';
    int area;
    area = LENGTH * WIDTH;
    printf("value of area : %d", area);
    printf("%c", NEWLINE)
    return 0;
 }

运行结果:value of area : 50


5.2.2.3 #define 与 const 区别

#define 与 const 这两种方式都可以用来定义常量,选择哪种方式取决于具体的需求和编程习惯。通常 情况下,建议使用 const 关键字来定义常量,因为它具有类型检查和作用域的优势,而 #define 仅进 行简单的文本替换,可能会导致一些意外的问题。

#define 预处理指令和 const 关键字在定义常量时有一些区别:

替换机制: #define 是进行简单的文本替换,而 const 是声明一个具有类型的常量。 #define 定义的常量在编译时会被直接替换为其对应的值,而 const 定义的常量在程序运行时会分配内 存,并且具有类型信息。

类型检查: #define 不进行类型检查,因为它只是进行简单的文本替换。而 const 定义的常量 具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。

作用域: #define 定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而const定义的常量具有块级作用域,只在其定义所在的作用域内有效。

调试和符号表:使用 #define 定义的常量在符号表中不会有相应的条目,因为它只是进行文本替 换。而使用 const 定义的常量会在符号表中有相应的条目,有助于调试和可读性。


6 C语言中标识符的命名规则以及注释

6.1 标识符的命名规则

  1. 只能由26个英文字母、数字或下划线3种字符组成。

  2. 第1个字符只能是字母或下划线。

  3. 大小写敏感的。

  4. 不能是关键字(关键词参考下面介绍的《C语言关键字》)。

合法标识符:Abc、a1、_max、day

非法标识符:1a、%abc、#33、a<b、1_2_5、in


6.2 C语言关键字

在c语言里面所谓的关键字,就是在我们编写代码时,颜色不一样的字。

而这些关键字,我们可以大致将其分为几类:存储类型、数据类型、控制语句、其他关键字。

类别 关键字
存储类型 auto、static、register、extern
数据类型 int、short、long、char、float、double、signed、unsigned、struct、enum、union、void
控制语句 if、else、switch、case、default、break、for、while、do、goto、continue
其他关键字 const、sizeof、typedef、volatile、return

6.3 C语言的注释

cpp 复制代码
/* 这是一个多行注释,
它将在编译时被自动忽略 
*/ 
int width = 20;  // 这是一个单号注释
int x = 10;  // 这是一个变量声明,它的值将被初始化为10     
double y = 3.14; // 这是一个浮点数赋值语句,它将被转换为一个双精度浮点数

7 C语言中printf与数据类型占位符

在上文中我们给大家介绍过printf,为了方便记忆我们列出了printf中常用的占位符

占位符 类型 说明
%d int 以十进制输出整数,%i 是以前的用法
%f float 输出单精度浮点数,可以指定精度,%2f 就是保留 2 位小数
%lf double 输出双精度浮点数,也可以指定精度
%c char 也可以使用 % d 输出 char,此时输出的是字符的 ASCII 码
%s 字符串 输出字符串

❗注意:printf中数据类型一定不能用错,这涉及到数据在内存中表示格式的问题

另外,在printf 中也可以同时使用多个占位符,只要前后和参数的类型、个数能够对得上就行

例如:

cpp 复制代码
 printf("name=%s, age=%d, height=%f", "itying", 18, 3.14);

补充:volatile关键字

在 C 中,volatile 关键字主要用于告诉编译器,被修饰的变量可能会以编译器未知的方式被修改,因此编译器在对该变量进行优化时需要特殊处理,不要对该变量的访问进行不必要的优化。

举例:

a += 1;

a += 2;

经过编译器优化后,会直接变成

a += 3;

有了关键字volatile,则会分步进行,不会进行合并优化

好处:嵌入式的每一个步骤可能都有相应的作用,而合并会导致过程或结果不同

相关推荐
子豪-中国机器人1 小时前
2月17日c语言框架
c语言·开发语言
张胤尘2 小时前
C/C++ | 每日一练 (2)
c语言·c++·面试
醉城夜风~2 小时前
[C语言]指针进阶压轴题
c语言
weixin_535854222 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘
宋康4 小时前
C/C++ 指针避坑20条
c语言·开发语言·c++
仟濹5 小时前
【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
c语言·c++·算法
YH_DevJourney5 小时前
Linux-C/C++《C/8、系统信息与系统资源》
linux·c语言·c++
Igallta_8136226 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
楼台的春风7 小时前
PWM(脉宽调制)技术详解:从基础到应用实践示例
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式
WiKiLeaks_successor7 小时前
C从入门到放弃篇1
c语言·开发语言