《C语言程序设计:问题与求解方法》——2.10节变量

2.10 变量
一些动态变化的量(比如车速、温度、股票价格等)称为变量,这些量在源程序中用常量无法表示。
用C语言进行编程,要使用数据区(数据值可变)而不是代码区(数据值不允许变)的内存单元来存放数据,都必须向编译程序提出申请。
在C语言源程序中,向编译程序申请一个(或几个)存放某种类型数据的、值的大小可以变化的内存单元称为定义变量。

2.10.1 变量的定义
定义一个简单变量的格式为:
类型名 变量名;
类型名要使用关键字(比如int、float、char等,参见2.7节),变量名必须使用标识符。
通过这种方式,编译程序为我们在内存中分配一个合适大小的内存单元,用来存放一个此类型的数据。
例如,在定义变量 int num; 之后, C编译程序通常会为变量num在内存中分配地址连续的2个(或4个)字节作为一个内存单元,用来存放变量num的数据,编译程序通过这种方式,把一个变量num与一个可以存放int型数据的内存单元联系了起来,参见图2-1。

延伸与拓展:编译程序为变量分配内存单元的技术内幕
编译程序通过扫描每个函数中的所有变量定义,建立起一张表,即变量名–内存单元地址对照表。接下来在扫描所有的语句时,编译程序就可以通过查找这张对照表,将源程序语句中出现的变量名转变为机器语言指令中的内存单元的地址,即指令中的操作数。
编译程序通过把变量名映射为内存地址的方式,达到了为变量分配相应内存单元的目的(类似于导游通过将游客名对应为房间号,达到了为每个游客分配一个房间的目的)。
定义多个简单变量的格式为:
类型名 变量名列表;
例如:
int age , num ,sum ;
在变量名列表中的多个变量名之间,要用逗号隔开,最后要以分号结束。编译程序会为每一个同类型的变量分配同样字节数的内存单元,用来存放各变量的值。
最好使用意义明确的标识符来定义变量,比如对于兔子的只数,使用标识符rabbit_count作为变量名就比用标识符n作变量名要好得多。

2.10.2 变量名和变量的值
由于变量的内存单元由编译程序分配,因此,在源程序的语句中,可以通过书写变量名来表示要“访问”(即存或取)变量所对应的内存单元中的数据了,这个数据称为变量的值。
比如,语句 num + 2 表示把变量名num所对应的内存单元中的值取出来(简称为把变量num的值取出来)再加上2( num + 2 其实是表达式,细节参见2.14节)。而语句“num = 21 ;”表示要把数值21存入变量名num所对应的内存单元中(简称为把数值21存入变量num中,“num = 21;”其实是赋值语句,细节参见2.16节)。
变量的值是“取之不尽”的。从内存单元取得一个变量的值,其实只是从一个内存单元中复制了这个值而已,该变量的值(没有发生任何变化)仍然可以再次取用;但是,变量的值又是“一存就变”的,只要运行了一条与存数操作有关的语句,(在内存单元中的)变量的“旧值”就被变量的新值覆盖掉了,变量的“旧值”将不复存在。
延伸与拓展:机器语言程序与高级语言源程序的最大不同点
机器语言程序中的指令经常使用内存地址(作为操作数)来指明要存取哪个内存单元中的数据;而高级语言源程序中的语句使用变量名来指明要存取哪个内存单元中的数据。这是机器语言程序与高级语言源程序最重要的不同点之一。内存地址是长长的、难以记忆的二进制位串;而变量名则是程序员自己所起的好记和易懂的(但要符合标识符规定的)名字。
通过这种方式,首先,使得源程序更为简明而可读性又好。其次,高级语言源程序所要加工的数据获得了极为宝贵的内存绝对位置无关性。这使得源程序具有了良好的移植性,也为多道程序同时放入内存中创造了先决条件。
但使用高级语言编程也存在一些缺点,在源程序的语句(或表达式)中,究竟何处是取变量的值(变量值不变),何处是将一个值存到变量之中(变量值将改变),变得有些模糊不清。这给初学者阅读和理解程序的运行带来一定的困难。这个问题读者要给予充分的注意,否则你就很可能读不懂很多程序。

2.10.3 各种基本类型的变量定义
1)整型变量(int):在程序运行时,需要内存单元存放(数值可以变化的)可正可负的整数时,要用此类型来定义。C编译器一般分配2个(16位系统)或4个字节(32位系统)的内存空间给一个int型变量。
占用两个字节的int型变量的取值范围在–32768~32767之间,这个范围比较小。
2)单精度浮点型变量(float):在程序运行时,需要内存单元存放以实数形式(即有小数分量)出现的量(比如34.1、–678.34、0.368等),要用此类型来定义。
比如,“float x,y;”就定义了两个单精度浮点型变量x和y。
一般C编译器分配4个字节的内存空间给一个float型变量。
单精度浮点型变量的精度是十进制的7位。也就是说,只有数值中的高7位数字肯定是正确无误的。
float型变量的优点是:取值范围远比int型变量大(大约正数是在1.17×10–38~3.4×1038之间,负数取值范围与正数是关于原点对称的)。float型变量的缺点是:运算速度不如int型变量快,所存入的数据通常也只是一个近似值。
3)字符型变量:用类型关键字char来定义字符型变量。
在程序运行时,需要用内存单元存储单个字符(通常是ASCII字符时),要用此类型来定义。C编译器分配1个字节的内存空间给一个char类型的变量。比如,“char ch1,ch2;”定义了两个字符变量ch1和ch2。
字符型变量属于一种从表面上看来是非数值型的量—字符。但其实在计算机的内存中,它通常就是一个以ASCII码形式存储的,占用一个字节内存的二进制码。在C语言中,把这个ASCII码当作一个小整数来对待。比如字符'a',实际上被编译程序看成是占用一个字节的整数97(但在有些高级语言比如Pascal语言中,不能把字符量当成整型量来对待)。
在高级编程语言中,任何类型变量的值都有一定的限定范围(这是由于存储变量值的字节数有限而造成的),程序运行时超出了变量允许的取值范围称为发生了溢出(关于溢出的讨论,请参见本书后面的讨论)。这是在编程时要注意避免和进行处理的。
变量允许的取值范围与所分配到的字节数有关,不同编译器为同一种类型变量分配的字节数很可能不一样,C语言标准只是规定了各种类型变量所占用内存的最少字节数(参见后续内容)。
延伸与拓展:“变量类型”的技术内幕
对于不同类型的变量,编译程序分配给变量的内存单元字节数很可能不一样,数据的外部形式、机内形式不一样,运算时选用的运算指令类型不一样(比如对于实型量加法,编译程序选用浮点数加法指令;而对于整型量加法,则选择整数加法指令),输入输出变量值的转换工作不一样,变量取值的允许范围可能不一样,允许进行的运算也不一样;但上述所有这些不一样,除了最后两项需要编程者注意外,大多都不需要编程者来具体操心。这些原本极为琐碎的基础性的编程工作,只要我们恰当地定义了变量的类型,并在程序语句中合理地使用变量,编译程序(包括标准输入输出库函数)基本上就可以为我们代劳了。

2.10.4 变量的初始化
变量的初始化就是存入一个初始数据到变量对应的内存单元中。
在C语言中,变量定义后,通常还要进行初始化,也就是事先要将一个数据存放在变量对应的内存单元中。有了一个有效的确定值,该变量才能在语句和表达式中用来参与运算或进行输出。否则,变量所对应的内存单元中(以前运行别的程序遗留下)的无效数据(我们将其称为垃圾数据),就会在程序语句的执行运算或输出时被误用,造成程序运行错误。
最简单的初始化变量的方法是在定义变量时,在变量后面用一个等号“=”给予它一个初始值。初始值必须是常量(或常量表达式)。比如以下变量定义:

int   number  ,  sum = 100;
char  ch1 = 'a'   ,  ch2;
float  area = 65.432 ;

这三条变量定义的“变量内存取值示意图”如图2-2所示。
变量名 number sum ch1 ch2 area
变量的值 垃圾数据 100 'a' 垃圾数据 65.432

可见,除了变量 number和ch2中的值是垃圾数据外,int型变量sum、char型变量ch1和float型变量area都得以初始化了。
初始化变量还有其他两种方法,即使用scanf()输入库函数和赋值语句(请参见2.12节和2.16节)。

时间: 2024-09-20 14:23:48

《C语言程序设计:问题与求解方法》——2.10节变量的相关文章

《C语言程序设计:问题与求解方法》——导读

目 录 第0章 "理想厨房"的工作原理0.1 理想厨房系统0.2 理想厨房系统的一个炒菜实例0.3 "理想厨房"工作的重要特点0.4 理想厨房系统与计算机系统术语对照表本章习题第1章 计算机的基本工作原理1.1 二进制简介1.2 计算机系统1.3 提高部分本章习题第2章 C语言程序结构和基本语法要素2.1 高级程序设计语言和编译程序简介2.2 C语言历史概述2.3 C语言源程序的主要构成成分:函数定义2.4 C语言源程序的次要组成成分:编译预处理命令.注释和声明2.

《C语言程序设计:问题与求解方法》——2.17节提高部分

2.17 提高部分2.17.1 对字符量的进一步说明 由于英文常用字符集中的字符数(比如ASCII字符集中有128个字符)通常比C语言字符集中的字符数(共有92个)多,C语言中允许使用一种特殊形式的字符常量来表示英文常用字符,这就是以反斜杠开头的转义字符,此时反斜杠后面的字符将转变成一种另外的意义.转义字符的名称由此而来. 最常用的转义字符是'\n' , 用来表示换行.其他常用转义字符见表2-6. 在源程序正文部分书写转义字符的方法与普通字符类似,都必须用单引号括住,比如'\n'.但是在格式化输

《C语言程序设计:问题与求解方法》——第2章C语言程序结构和基本语法要素

第2章 C语言程序结构和基本语法要素枯燥乏味乃生动有趣之母.欲速则不达.本章先介绍了程序设计语言和C语言的基本知识,2.3节和2.4节从粗粒度(函数)到中粒度(语句等)概述了C语言程序的构成成分:函数.定义.语句.编译预处理命令.注释等.2.5节到2.16节从细粒度到中粒度,讲解了如何由C字符集中的字符构成标识符.分隔符.关键字.常量.变量和运算符:以及如何由这些成分构成C程序(函数体)的基本的成分:定义.表达式和赋值语句.2.11节和2.12节对输入输出作了简要介绍.其中2.10节.2.14节

C++实现二叉树遍历序列的求解方法_C 语言

本文详细讲述了C++实现二叉树遍历序列的求解方法,对于数据结构与算法的学习有着很好的参考借鉴价值.具体分析如下: 一.由遍历序列构造二叉树              如上图所示为一个二叉树,可知它的遍历序列分别为:                       先序遍历:ABDECFG                       中序遍历:DBEAFCG                       后序遍历:DEBFGCA 我们需要知道的是,由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树:由

c语言-请问怎么学好《C语言程序设计教程》

问题描述 请问怎么学好<C语言程序设计教程> 这本书下学期就要学了,可是看着迷迷糊糊,看不懂,有没有什么学习的捷径?什么配套的辅导书比较好?谢谢! 解决方案 简单来说,就是Reading+Coding. 阅读入门可以从谭浩强的<C程序设计>开始,国人所写比较符合我们的思维习惯,但是过于基础,许多细节问题没有讲到,所以看完那本可以接着看看<C语言深度解剖>. 另外还有两本国外的C语言经典著作<C程序设计语言><数据结构与算法分析--C语言描述>,可

C语言学习教程第三章-C语言程序设计初步(1)

C语言程序设计 本课介绍C语言程序设计的基本方法和基本的程序语句.从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构.分支结构.循环结构. 这三种基本结构可以组成所有的各种复杂程序.C语言提供了多种语句来实现这些程序结构. 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础. C程序的语句 C程序的执行部分是由语句组成的. 程序的功能也是由执行语句实现的.C语句可分为以下五类:1.表达式语句2.函数调用语句3.控制语句4.复合语句5.空语句 1.表

《C语言程序设计与实践(第2版)》——导读

前言 C语言程序设计是一门理论与工程实践密切相关的专业基础课程,在计算机学科教学中具有十分重要的地位.大力加强该课程的建设,提高该课程的教学质量,有利于教学改革和教育创新,有利于创新人才的培养.通过本课程的学习,学生应培养良好的编程风格,掌握常见的算法思路,真正提高运用C语言编写程序解决实际问题的综合能力,为后续课程的实践环节打好基础. 目前国内关于C语言的教材较多,有些教材语法知识介绍细致,较适合作为非专业的等级考试类教学用书:有些教材起点较高,内容深奥,不适于初学者.为了帮助广大学生更好地掌

《C语言程序设计与实践(第2版)》——1.2 计算机与程序设计

1.2 计算机与程序设计 计算机的功能非常强大,能做非常复杂.人脑难以胜任的许多工作.然而,从电子市场买回CPU.主板.内存.硬盘等硬件并组装好一台计算机后,你却发现这台计算机什么也做不了.究其原因,就是因为该计算机上还没有安装任何计算机程序,即软件.硬件是计算机拥有强大功能的前提条件,但是如果没有"大脑"(也就是计算机程序)去指挥它,它将什么也做不了,所以计算机程序的存在是计算机能够工作.能够按指定要求工作的必要条件.因此,计算机程序(Program,通常简称程序)可以简单理解为人们

《C语言程序设计进阶教程》一导读

前 言 为什么要写这本书 本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书有什么不同呢?跟很多作者一样,我写这本书是因为我觉得有必要,觉得这本书中的方法比其他书中的更好. 我将现在已有的关于编程的书分为两类:入门和进阶.入门类书是给初学者写的,一般都假设读者没有编程基础,所以主要是介绍基本的概念.通常以"Hello World!"程序开始,也就是将"H