数据类型和变量的深入理解

news2024/10/6 6:43:35

引言:C语言数据类型的意义,数据在内存中的存储情况,变量的声明与定义的区别,和一些关键字。


 

目录

1.变量的定义与声明

1.1定义与声明

 1.2 变量的初始化与赋值

2.C语言常见的数据类型

 3.变量的作用域与生命周期

4.signed 和 unsigned

5. 强制类型转换

6.操作符 + - * /(加减乘除)和 = (赋值操作符)

7. 前置++,后置++,前置--,后置--

示例代码1(后置++):

 示例代码2(前置++):

 8. printf 和 scanf

拓展:

1.限定宽度:

2.控制浮点数的打印位数

3.scanf在读取时是否会读取空格和换行(回车)

结语:



 

1.变量的定义与声明

1.1定义与声明

所有的变量在定义时都会在内存中开辟一块空间

int main()
{
	int a;//变量a的定义,为a在内存中开辟一块空间
	return 0;
}

图解:

 声明可以声明无数次,而定义只能定义一次,多次定义会报错。

int main()
{
	int a;
	int a;
	return 0;
}

 

extern a;//声明完就可以使用该变量

 1.2 变量的初始化与赋值

赋值操作符:  = 

将等号右边的数据赋值给左边。

初始化:

int main()
{
	int a = 12;//在内存中给a开辟一块空间,并将12写进这块空间
	return 0;
}


2.C语言常见的数据类型

数据类型的大小(字节):

这里会使用关键字 sizeof;注意sizeof 是关键字,不是函数。

#include <stdio.h>
int main()
{
	//整形
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(short));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	//浮点型
	printf("%zd\n", sizeof(float));
	printf("%zd\n", sizeof(double));
	//布尔型
	printf("%zd\n", sizeof(_Bool));
	//字符型
	printf("%zd\n", sizeof(char));
	return 0;
}

 运算结果:

整形:就是能存储整数

浮点形:就是能存小数

布尔形:就是判断,值为true 或 false

#include <stdbool.h>//使用布尔类型的数据时需要包含的头文件
#include <stdio.h>
int main()
{
	_Bool a = true;
	if (a)
		printf("haha\n");
    return 0;
}

字符型:就是可以存放字符数据,每个字符都对应着一个0~127数字.所以在内存中存储的字符实际上是字符所对应的数字的二进制形式。


 3.变量的作用域与生命周期

局部变量:在代码块中定义的变量

全局变量:在代码块外定义的变量

int g_val = 10;//全局变量
int main()
{
	int a = 12;//局部变量
	return 0;
}

作用域:就是变量的作用范围

生命周期:变量在内存中被开辟到释放的这段时间

作用域与生命周期的差异:

作用域是描述的是空间;生命周期是时间。

局部变量的作用域为这个代码块,生命周期为进入这个代码到结束这个代码块。

全局变量的作用域为其所在的整个文件,生命周期为定义这个变量到整个程序结束。


4.signed 和 unsigned

signed 是有符号的意思

unsigned 是无符号的意思

#include <stdio.h>
int main()
{
	signed int a = -10;
	unsigned int b = -10;
	printf("%d\n", a);
	printf("%u\n", b);
    printf("%d\n", b);
	return 0;
}

问题:你感觉-10是否能存进b中呢?

这里附上结果:

答案:-10 可以存进变量b 

 图解:


 

5. 强制类型转换

强制类型转换操作符 : (类型)

#include <stdio.h>
int main()
{
	float a = 1.3f;
	int b = (int)a;//将浮点数1.3 强制转换为int 及只保留小数点之前的的数字
	printf("%f\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

 


6.操作符 + - * /(加减乘除)和 = (赋值操作符)

+ -  *这里就不多介绍了,这里主要介绍除

= :将等号右边的数据赋值到左边。

大家感觉以下的代码的结果是什么?

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	float c = a / b;
	printf("%f\n", c);
    return 0;
}

 答案:

 原因:

因为a 和b 都是整形,两个整形相除结果只保留整数部分,如果a或b中有一个及以上的浮点数,那么结果就是0.5。

代码如下:

#include <stdio.h>
int main()
{
	float a = 1.0;
	int b = 2;
	float c = a / b;
    printf("%f\n",c);
    return 0;
}

结果:

 


7. 前置++,后置++,前置--,后置--

++a;//前置++

a++;//后置++
//使用完a的自加1
//相当于 a = a+1;

--a;//前置--

a--;//后置--
//使用完 a的自减1;
//相当于 a = a-1;

前置与后置的区别:

前置:先使用后++

后置:先++后使用

示例代码1(后置++):

#include <stdio.h>
int main()
{
	int a = 1;
	int b = a++;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

 结果:

 解释:先将a赋值给b,a再自加1.

 示例代码2(前置++):

#include <stdio.h>
int main()
{
	int a = 1;
	int b = ++a;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

 结果:

解释:

先a自加1,然后再将a的值赋值给b 

--这里就不做介绍了


 8. printf 和 scanf

printf 和scanf 是库函数,使用时得引用头文件 

#include <stdio.h> //引用头文件

 printf:将内容打印到显示器上。

scanf:从键盘中读取数据。

占位符:就是这个位置的数据可以被替换。

示例代码1(printf):

#include <stdio.h>
int main()
{
	int a = 10;
	printf("a is %d\n", a);//%d 就是 int 类数据的占位符
	return 0;
}

结果: 

%d 被替换为变量a的数据。

示例代码2(scanf):

#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);//这句话的意思是将从键盘中读入的int类型的数据赋值给a
	printf("a is %d\n", a);
	return 0;
}

结果:

键盘中输入的12,被写入变量a中。 

常用的占位符:

int:%d;

unsigned int:%u

long : %ld

long long : %lld;

short:%hd

float:%f

double:%lf

char:%c

字符串:%s

size_t:%zd

八进制:%o

地址:%p

百分号:%%


拓展:

1.限定宽度:

#include <stdio.h>
int main()
{
	int a = 12;
	printf("a is %3d\n", a);
	printf("a is %-3d\n", a);
	return 0;
}

 %3d中的3就是限定宽度,限定其宽度至少为3位,如果不足三位则补空格,如果不加符号则为右对齐;加上负号,则为左对齐。

输出结果:

2.控制浮点数的打印位数

示例代码:

#include <stdio.h>
int main()
{
	float a = 1.3;
	printf("%f\n", a);
	printf("%.1f\n", a);//控制小数点后打印一位
	return 0;
}

打印结果:

3.scanf在读取时是否会读取空格和换行(回车)

示例代码1:

#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	printf("a is %d\n", a);
	return 0;
}

 

结论:scanf在读入非字符数据时,不会读入空格和换行 

示例代码2:

#include <stdio.h>
int main()
{
	char a;
	scanf("%c", &a);
	return 0;
}

输入换行: 

 

输入空格:


问题: 那有没有办法不读入空格和换行呢?

这里有一种写法:

#include <stdio.h>
int main()
{
	char a;
	scanf(" %c", &a);//在%c的前面加上了空格,这样就不会读入键盘输入的空格和换行了。
	printf("a is%c!", a);
	return 0;
}

 输入换行和空格:

结论:在%c的前面加上空格就不会读入空格和换行。 

 


结语:

又是开森的一天,改了个名,寓意遥远的远方就在自己的脚下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot mybatis-starter解析

mybatis-starter使用指南 自动检测工程中的DataSource创建并注册SqlSessionFactory实例创建并注册SqlSessionTemplate实例自动扫描mappers mybatis-starter原理解析 注解类引入原理 查看对应的autoconfigure包 MybatisLanguageDriverAutoConfiguration 主要是协助使用注解来…

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天&#xff0c;维护那天之前的最小值即可。 在题目中&#xff0…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

npm ERR! code CERT_HAS_EXPIRED 淘宝镜像失效

近期vue安装失败&#xff0c;具体如下&#xff1a; 1.先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2.certificate has expired npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.o…

【面试题】RocketMQ怎么处理消息积压?

如图,消息积压主要是因为&#xff0c;消费能力不足&#xff1a; 在RocketMQ中&#xff0c;处理消息积压的方法可以采取以下几种策略&#xff1a; 增加消费者数量&#xff1a;可以通过增加消费者数量来提高消息的消费速度。通过增加消费者实例或者消费者组的数量&#xff0c;可…

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现&#xff0c;那怎么样才能实现这一过程&am…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

【二叉树】Leetcode 101. 对称二叉树【简单】

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解题思路 判断一棵二叉树是否是轴对称的&#xff0c;可以通过递归方式进行判断。 1、定义一个递归函数isMirr…

【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

目录 前言 函数重载 概念 重载函数的条件 C支持重载函数的原理--名字修饰 引用 概念 特性 常引用&#xff08;const引用&#xff09; 使用场景 传值&#xff0c;传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto关键字&#xff08;C11&#xff09; a…

javaWeb项目-家政服务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、B/S结构简介 B/S…

OpenHarmony实战:使用宏、std::bind 巧妙实现进出函数日志打印

背景 我们始终渴望了解模块的调用、时序逻辑&#xff0c;每个人都会轻易地想到在函数的入口打印一条进入 enter 相关的日志&#xff0c;在函数的出口打印一条离开 leave 相关的日志。不能有遗漏&#xff0c;我们会复制这条日志到所有关心的函数中&#xff0c;为了表明是哪个模…

网络以太网之(1)基础概念

网络以太网之(1)基础概念 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

EI会议相当于国内什么期刊?

EI工程索引收录类型有EI期刊和EI会议&#xff0c;EI会议水平是比较高的&#xff0c;也有的作者喜欢将EI会议与国内刊物作比较&#xff0c;那么EI会议相当于国内什么期刊&#xff1f;这主要看是什么级别的会议&#xff0c;顶尖学术会议相当于国内北大核心期刊。 EI会议应用范围和…

python怎么处理txt

导入文件处理模块 import os 检测路径是否存在&#xff0c;存在则返回True&#xff0c;不存在则返回False os.path.exists("demo.txt") 如果你要创建一个文件并要写入内容 #如果demo.txt文件存在则会覆盖&#xff0c;并且demo.txt文件里面的内容被清空&#xff0c;如…

系统架构图怎么画

画架构图是架构师的一门必修功课。 对于架构图是什么这个问题&#xff0c;我们可以按以下等式进行概括&#xff1a; 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达&#xff0c;这是一个自然而然的过程。 不是先有图再有业务流程、系统设计和领域模型等&#…

哈希表(Hash Table) -- 用数组模拟--字符串前缀哈希

本文用于个人算法竞赛学习&#xff0c;仅供参考 目录 一.什么是哈希表 二.哈希函数中的取模映射 三.拉链法&#xff08;数组实现&#xff09; 四.拉链法模板 五.开放寻址法 六.开放寻址法模板 七.字符串前缀哈希 九.字符串前缀哈希 模板 十.题目 一.什么是哈希表 哈希表&…

fork复制进程

1.shell: 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“为使用者提供操作界面”的软件&#xff08;command interpreter&#xff0c;命令解析器&#xff09;。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&am…

C语言中入门到实战————动态内存管理

目录 前言 一、为什么要有动态内存分配 二、 malloc和free 2.1 malloc 2.2 free 三、calloc和realloc 3.1 calloc 3.2 realloc 四. 常见的动态内存的错误 4.1 对NULL指针的解引用操作 4.2 对动态开辟空间的越界访问 4.3 对非动态开辟内存使用free释放 4.4 使…

2024年【T电梯修理】考试题及T电梯修理考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【T电梯修理】考试题及T电梯修理考试内容&#xff0c;包含T电梯修理考试题答案和解析及T电梯修理考试内容练习。安全生产模拟考试一点通结合国家T电梯修理考试最新大纲及T电梯修理考试真题汇总&#xff0c;有助…

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…