当前位置: 首页 > news >正文

闹心的变量

第三节 闹心的变量

不得不说,C语言里面最闹心的就属变量了。变量的数据类型、变量名、变量的初值、变量的地址……对于初学者来说,这些抽象的概念,都非常难以理解。在去年夏天的网络课程中,我也是专门花了一节课多的时间给大家来讲解变量。但是还有有不少的同学来找我问,到底什么是变量。
但是具体什么是变量呢?虽然很多教科书上喜欢说变量是一种容器,但是这种比喻在后期我们学习数组的时候就会变得抽象。我更倾向于把变量比喻成饭碗或者饭盒。那么我们既然把变量比喻成了饭盒,那么我们就要给这个饭盒贴一个商标,那么这个商标就叫做变量名。那么我们都知道,商品的商标是唯一的,一个商品一般只有一个商标,而且这个商标是不能和已经有的其他商标重复的。那么变量名也有这样的特点。变量名是唯一。在生活中,我们经常会用某些品牌的商标来指代产品。那么在程序中也是一样,我们要用变量名指代变量。那么变量名的命名规则呢,我们这里称为C语言标识符命名规则,这个规则如下:
1.标识符由英文字母、数字和下划线组成,区分大小写
2.标识符的第一位不能是数字
3.C语言的保留字不能作为标识符。
这里我们的变量名就属于标识符的一种。之后我们还会学到其他种类的标识符,命名规则类似。
这里我们说的C语言的保留字(也有关键字的叫法)包括的内容请看附录2。
另外呢,虽然标识符可以命名为库函数名和预编译处理命令,但是如果那么做了,库函数名和预编译处理命令,就会失去本来系统已经规定好的原意。至于什么是库函数名和预编译处理命令我们后面还会详细的讲解。在近期我们统一使用按照字母表顺序的小写字母作为标识符。等到我们讲完C语言的基础知识,我们就可以尝试使用较为正式的标示符作为变量名了。
说了这么多,我们还没有讲怎么使用变量呢。我们既然把变量比喻成饭盒,我们就现需要买一个饭盒。在C语言中我们把这个类似于买饭盒的过程叫做定义变量。(也有称为声明变量的说法)商店里面的商品琳琅满目,饭盒的种类也多种多样,有塑料的,有铝质的等等。那么我们的变量的种类也是多种多样的。那么我们现在暂时先接触一种最简单,最基本的变量——整型变量。
整形变量的概念和整数有一点儿像,但是又不完全一样。如果把变量比喻成饭盒,那么数据就可以比喻成饭菜。如果一个数据是整数,那么我们就要用整型变量来盛放它。这就像我们生活中,盛汤的有汤碗,盛饭的有饭碗一样。专碗专用。那么变量也是这样,某一类型的变量就专门用了盛放某一类型的数据,不能混用。(也有混用的情况,但是暂时还不涉及) 闲言少叙,直接看下面的例子:

例1-5
#include<stdio.h>
main(){
    int a;
    a=5;
    printf("整型变量a的值是%d\n",a);
    system("pause"); 
}

那么在这个程序里面printf("整型变量a的值是%d\n",a);是我们非常熟悉的内容,这里面的新内容只是把参数列表里面的数字和式子换成了变量名a,int a;这一条语句的含义是定义一个变量名为a的整型变量,就相当于我们去商店买饭盒的过程。a=5;叫做赋值语句,它的含义是把整数数值5赋值给a,相当于我们用饭盒盛饭的过程。更详细的解释就是,我们用了一个商标是a的饭盒成了饭,这里面的饭就是5这个数。接下来就到了我们熟悉的这一步printf("整型变量a的值是%d\n",a);这里引号里面的格式化字符串除了转义字符和格式说明符以外的部分原样输出,遇到%d格式说明符应该用后面参数列表里面的值去替换,参数列表里面有一个a,那么a恰巧又是个变量名。之前讲解过,变量会被变量名所指代,那么反过来看到变量名应该想到这个变量名代表的变量,那么a所代表的变量里面的数值的整数5,那么这个%d就会被5替换。最后遇到转义字符\n,它是个换行符,运行结果如图1-7所示。
图1-7
如果搞明白上面的内容,我们就可以进一步学习更有趣儿的东西了。我们接着再做一次例1-4的那个例子,但是这次我们使用变量。

例1-6
#include<stdio.h>
main(){
    int a;
    int b;
    a=8;
    b=5;
    printf("%d+%d=%d\n",a,b,a+b);
    printf("%d-%d=%d\n",a,b,a-b);
    printf("%d×%d=%d\n",a,b,a*b);
    printf("%d÷%d=%f\n",a,b,a/b);
    system("pause"); 
}

图1-8
运行我们的例1-6就会得到如图1-8的结果,除了8÷5之外的大获成功。那么似乎我们遇到了和之前类似的问题,除法似乎又任性了。那么根据之前的思路,我们需要把两个数改成小数的形式。但是我之前说过,某一类型的变量就专门用了盛放某一类型的数据,不能混用。既然把数写成了小数的形式,我们就认为这个数是小数,所以整型变量不能盛放小数。我们需要引入一个用于盛放小数的变量——单精度变量。
实际上,盛放小数的变量有很多种。我们这里先介绍一种最为常见的盛放小数的变量,它叫做单精度变量。之前也说过,变量可以理解为饭盒,所以无论什么样的变量,只要是变量它就可以理解为饭盒。要说明饭盒的材质,品牌,和里面盛放的饭菜。
对于整型变量来说有 int a;
那么类似的对于单精度变量有 float a;
这里int代表整型,float代表单精度。这是说明我们饭盒的材质。是塑料的,还是铝制的,还是不锈钢的。
a是变量名,相当于饭盒的商标。那么自然就有了下面的程序

例1-6修改1
#include<stdio.h>
main(){
    float a;
    float b;
    a=8.0;
    b=5.0;
    printf("%f+%f=%f\n",a,b,a+b);
    printf("%f-%f=%f\n",a,b,a-b);
    printf("%f×%f=%f\n",a,b,a*b);
    printf("%f÷%f=%f\n",a,b,a/b);
    system("pause"); 
}

图1-9
大功告成!注意变量的类型从int变成float之后,对应的格式说明符也要改变成%f。实际上我们还可以把这个程序写的简单一点儿。
a和b两个变量的类型都是float(单精度),那么我们可以说a品牌的饭盒是塑料的,b品牌的饭盒是塑料的。我们也可以说a品牌的饭盒和b品牌的饭盒都是塑料的。
那么C语言也给我们提供了这种偷懒的办法。
float a;float b;可以写成float a,b;这就是说两个变量都是float(单精度)的意思。
我们还可以把float a;float b;a=8.0;b=5.0;这四句话写在一起,变成float a=8.0,b=5.0;这只是C语言提供给我们的偷懒的途径。因为C语言本身就是懒人语言。如果你是一个勤劳的小蜜蜂,那么分开写也没有关系。只不过需要知道,更多的程序员更喜欢这种偷懒的写法。所以要适应这种懒惰的习惯。

例1-6修改2
#include<stdio.h>
main(){
    float a=8.0,b=5.0;
    printf("%f+%f=%f\n",a,b,a+b);
    printf("%f-%f=%f\n",a,b,a-b);
    printf("%f×%f=%f\n",a,b,a*b);
    printf("%f÷%f=%f\n",a,b,a/b);
    system("pause"); 
}

现在我们变量这一部分算解决了很大的难题。之后我们无论学习多复杂的程序,还有之后我们要一起做软件,这些都是最基础的内容,也是永远逃脱不掉的东西。希望大家多多复习这一部分的知识。

转载于:https://www.cnblogs.com/yevgeny/p/5136690.html

相关文章:

  • [转载]项目风险管理七种武器-碧玉刀
  • 会声会影简易相册制作教程
  • Spark学习之基于MLlib的机器学习
  • zabbix在centos6下的编译安装
  • C语言 百炼成钢1
  • 【Linux】环境变量设置
  • Apache安装教程
  • 数众数
  • Struts的属性驱动和模型驱动
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • RHCA CL220实战系列(一)之KVM部署CloudForms
  • C 指针函数
  • 使用visualvm的插件btrace的一个例子
  • 在java程序中访问windows有用户名和密码保护的共享目录
  • expect 自动登录
  • 【node学习】协程
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017-09-12 前端日报
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • angular学习第一篇-----环境搭建
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Git学习与使用心得(1)—— 初始化
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS 系统授权开发
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Python 反序列化安全问题(二)
  • React 快速上手 - 07 前端路由 react-router
  • 缓存与缓冲
  • 机器学习学习笔记一
  • 模型微调
  • 前端js -- this指向总结。
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何选择开源的机器学习框架?
  • 小试R空间处理新库sf
  • 学习JavaScript数据结构与算法 — 树
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​ssh免密码登录设置及问题总结
  • (03)光刻——半导体电路的绘制
  • (12)Hive调优——count distinct去重优化
  • (k8s中)docker netty OOM问题记录
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (转)LINQ之路
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core 依赖注入的基本用发
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 事件模型教程(二)
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @private @protected @public
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [android] 练习PopupWindow实现对话框
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试