《一文读懂 C 语言数据类型和变量:基础、操作与输入输出详解》

目录

1 数据类型介绍

2 变量  常量

变量是什么呢?  

变量命名规则 

三个存放变量的区域

生命周期

作用域

常量是什么呢?

3 算数操作符和赋值操作符

4 printf和scanf

printf :

scanf:


 1 数据类型介绍

1.1  字符型 char             占位符是%c

1.2  整型  int                   占位符是%d

1.3  浮点型                     单精度float   双精度double       打印时的占位符分别是%f   %lf

1.4  布尔类型  _Bool      专门表示真假 ture与false         使用时必须有头文件#include<stdbool.h>

占位符如下表

1.5 各种数据类型的长度

使用 sizeof 操作符    

计算的结果的单位是字节  打印时的占位符为%zd 

char : 1               bool : 1                short : 2

int :  4                  float : 4                  long  :  4或8

double  :  8          long long:  8         long double  :  8或16   (与标准有关)

注: sizeof中的计算式并不会求值  如下:

s为int类型 占4字节 但a b为double类型 占8个字节 最终结果由s自己决定  s是int类型 因此计算的sizeof最终结果还是4个字节  而由于sizeof并不会抢时计算 所以s的值并不会改变 

signed和unsigned的区别

signed 表示 有符号的 既有正负 

unsigned 表示 无符号的 既只有正数

注: 只修饰字符型和整型 既修饰char类型和int类型的

使用unsigned时 会使能够存储的最大值变大一倍  就好比signed的short int类型是从  -32768~32768 而unsigned的长度就是从0~65535  就好比把负数的长度移动到了正数上  一般不加是默认是signed类型    既signed int ==int  

而char默认是signed类型并不能确认 由编译器决定  c语言并没有给出具体标准  现目前VS中 signed char == char

sizeof的返回值类型是  size_t (无符号整型)  用%zd打印  


2 变量  常量

变量是什么呢?  

变量就是会改变的量 有我们自己设定  在程序过程中可以修改

变量命名规则 

字母数字下划线组成          不以数字开头

大小写敏感         不可超过63个字符            不可使用关键字

变量分为 局部变量和全局变量 

全局变量: 定义在大括号外

局部变量 : 定义在大括号外

全局变量和局部变量重名时 局部变量优先使用 

但若在括号外使用局部变量则会报错 因为局部变量只能在作用域中 (括号内) 使用

而在括号外使用局部变量则会报错 如下

创建变量就是在内存中开辟区域来存放数据

而不同类型的变量就会存放在不同的区域

三个存放变量的区域

1 栈区 :         局部变量  函数参数 

2 堆区 :        用于动态内存管理 malloc calloc realloc free

3 静态区 :    全局变量  静态变量

生命周期

变量的生命周期指的是:变量从创建到被销毁之间的时间段

局部变量的生命周期: 从作用域开始到出作用域 生命周期结束

全局变量的生命周期: 整个程序的生命周期

作用域

按我理解 就是在程序中数据的有效使用空间 

局部变量的作用域

变量所在的局部范围  一般是 {  }  内部

全局变量的作用域

整个程序

常量是什么呢?

常量就是指的不会改变的量

C语言常见的常量分为以下几种:

字面常量 

例如: 1  5  10.22  'a'  "abcdef   "等可以从字面上读出来的量

const修饰的常变量   

例如: const  int  a=100;  此时 a这个变量被const修饰 则a变为了常变量

a只是变成了不可修改的变量而已 既常变量 编译器依旧会认为它是变量属性

例如定义数组则会报错  int arr[a];  此时依旧会报错

#define定义的标识符常量 

例如: #define  O  100; 此时就将O定义为了标识符常量 值为100

枚举常量

enum是定义枚举类型的关键字  而Color是一种枚举类型

enum Color 

{   red ,     green ,     blue ,   };

//red green blue 是枚举类型Color的可能取值  是常量  叫枚举常量

enum Color  c=red;  //  定义了一个枚举类型 c  赋值为red 


3 算数操作符和赋值操作符

算数操作符

有  +  -  *  /  %

其中% 表示取余  不会四舍五入 是直接舍去小数部分 而且只能用于整数计算  

注 : 负数求模的规则  结果的正负号由第一个运算数的正负号决定

赋值操作符

如图 有解释

注: 全局变量不初始化时 默认为0  而局部变量不初始化 值是随机的 并会报错

 单目操作符

 ++     --     +(正号)    -(负号)     {只需要一个操作数}

关于 a++ 和 a--

a++ 和 ++a 之后 a都等于a+1            a-- 和 --a同理

区别在于 a++这个式子等于a  而++a这个式子等于a+1


4 printf和scanf

printf :

printf是将参数文本打印在屏幕上  但不会换行  为了让输出的文本换行 可以在末尾加上 \n

printf("小寒是笨蛋\n");   将在屏幕上输出 小寒是笨蛋 

其中\n也可以放在句子中间 例如 printf("小寒\n是笨蛋")  将会输出如下情况

而还有一种输出方式  既使用占位符 

printf("%s是一个baby","小寒");  其中%s为字符串的占位符 表示占取一个位置 打印如下

占位符

占位符不止%s 有许多 我将常见的列举于下

其中占位符还可以限制宽度 如下

 

其中若宽度不够 会使用空格进行补齐  而若宽度超过则直接打印  因为限制的是最小宽度 

若宽度不够 %5d 是向右靠齐  而%-5d 是左靠齐 

而%5.2d  表示最小宽度为5  小数点后保留2位  多的四舍五入  并且不限制时 %d小数点后默认6位

使用强制类型转换是舍去小数点 而使用限制小数是四舍五入 

还有一种额外的限定方法 使用printf的传参来使用 

既  printf("%*.*f\n",6,2,-1.456);  

 甚至可以输出字符串的前几位 

scanf:

scanf 在vs上会报错 他会认为scanf不安全 只需要在前面加上#define _CRT_SECURE_NO_WARNINGS 即可 

scanf 返回的是读取到的数据的数目  是int类型 

如下

 

 print  + scanf 是一队函数 

scanf在输入时 除开%c都会自动忽略起手空白字符(空格)  

如果在输入%c的时候也想跳过起手空白字符需要在%c前加入一个空格

例 scanf("  %c",&c);   -----   其中&为取地址符号 -----  %c前是一个空格

其中在使用%s的时候需要注意 %s在读取字符串的时候是不包含空白字符的(空格 换行符 制表符)

并且scanf()遇到%s时 还会在末尾加上一个\0  

如下 输入sss ss 输出sss

假如想要在%s输入时 将空格也录入进去 可以这样写代码

在%9[^\n]中     ------[^\n]表示遇到\n才结束输入 

------9表示scanf只录入9个数据 

因为留一个给\n  如果输入超过9个时会报错  这样会避免报错 直接使用输入数据的前9个  

scanf函数中,%*c%c的区别如下:

1. %c

  • 功能:读取一个字符(包括空白字符如空格、换行符\n等),并将其存储到对应的变量中。
  • 示例
    char ch;
    scanf("%c", &ch);  // 读取输入的下一个字符,存入ch
    
    • 输入 A,则 ch 的值为 'A'

2. %*c

  • 功能:读取一个字符但不存储到任何变量中*表示忽略赋值)。通常用于跳过不需要的字符(如输入缓冲区中的换行符)。
  • 示例
    int num;
    char ch;
    scanf("%d", &num);    // 读取整数(遇到换行符停止,换行符留在缓冲区)
    scanf("%*c%c", &ch);  // 跳过换行符,读取下一个字符
    
    • 输入 123\nA
      • 第一次scanf读取123,换行符\n留在缓冲区。
      • %*c跳过\n%c读取'A'存入ch

关键区别

格式是否存储字符典型用途
%c读取并保存字符
%*c跳过字符(清理输入缓冲区)

常见场景

  • 清理缓冲区
    当输入中混入多余字符(如换行符)时,用%*c跳过:

    scanf("%d%*c", &num); // 读取整数后跳过紧随的换行符
    
  • 精确读取
    若需要读取特定格式(如X-Y),可用%*c跳过分隔符:

    scanf("%c%*c%c", &a, &b); // 读取形如"A-B"的输入,跳过中间的'-'
    

总结

  • %c:正常读取字符并保存。
  • %*c:读取但丢弃字符,常用于处理输入中的干扰项。

根据是否需要保留字符选择合适的格式符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿方猛敲c嘎嘎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值