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

目录

1 字面量

2 整数类型

2.1 整数类型的取值范围 

2.1.1 sizeof 运算符 

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

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

2.4 整数类型代码演示

3 浮点类型

3.1 浮点类型的取值范围

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

3.3 保留2位小数点

4 char字符型

4.1 char类型的取值范围

4.2 ASCII码表(了解)

4.3 C语言中的字符串

4.3.1 %s  用户字符串的输出

5 C语言中的变量和常量

5.1 变量

5.1.1 一次定义多个变量

5.2 常量

5.2.1 字符常量 (转义字符)

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

5.2.2.1 #define 预处理器定义常量

5.2.2.2 const 关键字定义常量

5.2.2.3 #define 与 const 区别

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

6.1 标识符的命名规则

6.2 C语言关键字

6.3 C语言的注释

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 整数类型的取值范围 

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

类型存储大小值范围
char1 字节-128 到 127 或 0 到 255
unsigned char1 字节0 到 255
signed char1 字节-128 到 127
int4 字节-2,147,483,648 到 2,147,483,647
unsigned int4 字节0 到 4,294,967,295
short2 字节-32,768 到 32,767
unsigned short2 字节0 到 65,535
long4 字节-2,147,483,648 到 2,147,483,647
unsigned long4 字节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 类型的大小: 

#include <stdio.h>

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

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

单位名称英文全称与下一级单位换算关系
比特bit-
字节byte1B = 8 bit
千字节Kilobyte1KB = 1024B
兆字节Megabyte1MB = 1024KB
吉字节Gigabyte1GB = 1024MB

1bit=8位     00000 00000 ~ 1111 11111


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

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

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

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

 #include<stdio.h>

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

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

#include <stdio.h>

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

2.4 整数类型代码演示

#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 浮点类型的取值范围

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

类型存储大小值范围精度
float4 字节1.2E-38 到 3.4E+386 位有效位
double8 字节2.3E-308 到 1.7E+30815 位有效位
long double16 字节3.4E-4932 到 1.1E+493219 位有效位

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

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

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


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

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

#include <stdio.h>

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

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

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

#include<stdio.h>

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

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

#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位小数点

#include <stdio.h>

 int main()
 {
     float a = 3.1415f;
     printf("%.2f", a);
     return 0;
 }
#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 char0 到 255

如果想要明确指定有符号或无符号的字符类型,可以分别使用 signed char 和 unsigned char,这样在不同编译器下取值范围就确定了。

char字符类型数据在printf函数中一般采用c%格式进行输出

#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格式输出。

下面通过程序了解一下:

#include <stdio.h>

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

输出结果:

A

65


4.2 ASCII码表(了解)

编码字符编码字符编码字符编码字符
0NUL32Space64@96`
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39'71G103g
8BS40(72H104h
9TAB41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DC149181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23ETB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92|124
29GS61=93]125}
30RS62>94^126~
31US63?95_127DEL

4.3 C语言中的字符串

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

例如:

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

#include <stdio.h>

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

4.3.1 %s  用户字符串的输出

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

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

#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定义的数据都是变量。

#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 一次定义多个变量

#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...一个或多个数字的十六进制数
#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 预处理器定义常量的形式:

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

#define 常量名 常量值

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

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

#define PI 3.14159

实例: 

 #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 前缀声明指定类型的常量,如下所示:

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

const 数据类型 常量名 = 常量值;

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

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

const int MAX_VALUE = 100;

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

错误写法:

const int var;


const int var;
var=5;

正确写法:
const int var = 5;

实例: 

 #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语言的注释

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

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

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

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

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

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

例如:

 printf("name=%s, age=%d, height=%f", "itying", 18, 3.14);

补充:volatile关键字 

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

举例:

a += 1;

a += 2;

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

a += 3;

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值