C 语言中的变量和赋值

目录汇总:C 语言入门教程:面向萌新小白的零基础入门教程

很少有程序会像 编写一个简单的 C 程序 中的示例那样简单。大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。和大多数编程语言一样,C 语言中的这类存储单元被称为变量(variable)。

一、类型#

每一个变量都必须有一个类型(type)。类型用来说明变量所存储的数据的种类。C 语言拥有广泛多样的类型。但是现在,我们将只限定在两种类型范围内:int 类型和 float 类型。由于类型会影响变量的存储方式以及允许对变量进行的操作,所以选择合适的类型是非常关键的。数值型变量的类型决定了变量所能存储的最大值和最小值,同时也决定了是否允许在小数点后出现数字。

int(即 integer 的简写)型变量可以存储整数,如 0、1、392 或者 -2553。但是,整数的取值范围是受限制的。最大的整数通常是 2 147 483 647,但在某些计算机上也可能只有 32 767。

float(即 floating-point 的简写)型变量可以存储比 int 型变量大得多的数值。而且,float 型变量可以存储带小数位的数,如 379.125。但 float 型变量也有一些缺陷。进行算术运算时 float 型变量通常比 int 型变量慢;更重要的是,float 型变量所存储的数值往往只是实际数值的一个近似值。如果在一个 float 型变量中存储 0.1,以后可能会发现变量的值为 0.099 999 999 999 999 87,这是舍入造成的误差。

二、声明#

在使用变量之前必须对其进行声明(为编译器所做的描述)。为了声明变量,首先要指定变量的类型,然后说明变量的名字。例如,我们可能这样声明变量 heightprofit

1
2
int height;
float profit;

第一条声明说明 height 是一个 int 型变量,这也就意味着变量 height 可以存储一个整数值。第二条声明则表示 profit 是一个 float 型变量。

如果几个变量具有相同的类型,就可以把它们的声明合并:

1
2
int height, length, width, volume;
float profit, loss;

注意每一条完整的声明语句都要以分号结尾。

main 函数的第一个模板中并没有包含声明。当 main 函数包含声明时,必须把声明放置在语句之前:

1
2
3
4
5
int main(void)
{
  声明
  语句
}
就书写格式而言,建议在声明和语句之间留出一个空行。

在 C99 中,声明可以不在语句之前。例如,main 函数中可以先有一个声明,后面跟一条语句,然后再跟一个声明。为了与以前的编译器兼容,本教程中的程序不会采用这一规则。但是,考虑到 C++ 和 Java 程序中在使用时才声明变量的情况很常见,估计将来在 C99 程序中这种做法也会很流行。

三、赋值#

变量通过赋值(assignment)的方式获得值。例如,语句

1
2
3
height = 8;
length = 12;
width = 10;

把数值 8、12 和 10 分别赋给变量 heightlengthwidth,8、12 和 10 称为常量(constant)。

变量在赋值或以其他方式使用之前必须先声明。也就是说,我们可以这样写:

1
2
int height;
height = 8;

但下面这样是不行的:

1
2
height = 8;     /*** WRONG ***/
int height;

赋给 float 型变量的常量通常都带小数点。例如,如果 profit 是一个 float 型的变量,可能会这样对其赋值:

1
profit = 2150.48;

当我们把一个包含小数点的常量赋值给 float 型变量时,最好在该常量后面加一个字母 f(代表 float):

1
profit = 2150.48f;

不加 f 可能会引发编译器的警告。

正常情况下,要将 int 型的值赋给 int 型的变量,将 float 型的值赋给 float 型的变量。混合类型赋值(如把 int 型的值赋给 float 型变量或者把 float 型的值赋给 int 型变量)是可以的,但不一定安全。

一旦变量被赋值,就可以用它来辅助计算其他变量的值:

1
2
3
4
height = 8;
length = 12;
width = 10;
volume = height * length * width;     /* volume is now 960 */

在 C 语言中,符号 * 表示乘法运算,因此上述语句把存储在 heightlengthwidth 这 3 个变量中的数值相乘,然后把运算结果赋值给变量 volume。通常情况下,赋值运算的右侧可以是一个含有常量、变量和运算符的公式(在 C 语言的术语中称为表达式)。

四、显示变量的值#

printf 可以显示出变量的当前值。以

Height: h

为例,这里的表示变量 height 的当前值。我们可以通过如下的 printf 调用来实现输出上述信息的要求:

1
printf("Height: %d\n", height);

占位符 %d 用来指明在显示过程中变量 height 的值的显示位置。注意,由于在 %d 后面放置了 \n,所以 printf 在显示完 height 的值后会跳到下一行。

%d 仅用于 int 型变量。如果要显示 float 型变量,需要用 %f 来代替 %d。默认情况下,%f 会显示出小数点后 6 位数字。如果要强制 %f 显示小数点后位数字,可以把放置在 %f 之间。例如,为了显示信息

Profit: $2150.48

可以把 printf 写为如下形式:

1
printf("Profit: $%.2f\n", profit);

C 语言没有限制调用一次 printf 可以显示的变量的数量。为了同时显示变量 height 和变量 length 的值,可以使用下面的 printf 调用语句:

1
printf("Height: %d Length: %d\n", height, length);

程序 计算箱子的空间重量

运输公司特别不喜欢又大又轻的箱子,因为箱子在卡车或飞机上运输时要占据宝贵的空间。事实上,对于这类箱子,公司常常要求按照箱子的体积而不是重量来支付额外的费用。在美国,通常的做法是把体积除以 166 (这是每磅允许的立方英寸数)。如果除得的商(也就是箱子的“空间”重量或“体积”重量)大于箱子的实际重量,那么运费就按照空间重量来计算。(除数 166 是针对国际运输的,计算国内运输的空间重量时通常用 194 代替。)

假设运输公司雇你来编写一个计算箱子空间重量的程序。因为刚刚开始学习 C 语言,所以你决定先编写一个计算特定箱子空间重量的程序来试试身手,其中箱子的长、宽、高分别是 12 英寸、10 英寸和 8 英寸。C 语言中除法运算用符号 / 表示。所以,很显然计算箱子空间重量的公式如下:

1
weight = volume / 166;

这里的 weightvolume 都是整型变量,分别用来表示箱子的重量和体积。但是上面这个公式并不是我们所需要的。在 C 语言中,如果两个整数相除,那么结果会被“截短”:小数点后的所有数字都会丢失。12英寸 ×10英寸 ×8英寸的箱子体积是 960 立方英寸,960 除以 166 的结果是 5 而不是 5.783,这样使得重量向下取整;而运输公司则希望结果向上取整。一种解决方案是在除以 166 之前把体积数加上 165:

1
weight = (volume + 165) / 166;

这样,体积为 166 的箱子重量就为 331/166,取整为 1;而体积为 167 的箱子重量则为 332/166,取整为 2。下面给出了利用这种方法编写的计算空间重量的程序。

dweight.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* Computes the dimensional weight of a 12" x 10" x 8" box */

#include <stdio.h>

int main(void)
{
  int height, length, width, volume, weight;

  height = 8;
  length = 12;
  width = 10;
  volume = height * length * width;
  weight = (volume + 165) / 166;

  printf("Dimensions: %dx%dx%d\n", length, width, height);
  printf("Volume (cubic inches): %d\n", volume);
  printf("Dimensional weight (pounds): %d\n", weight);

  return 0;
}

这段程序的输出结果是:

Dimensions: 12x10x8
Volume (cubic inches): 960
Dimensional weight (pounds): 6

五、初始化#

当程序开始执行时,某些变量会被自动设置为零,而大多数变量则不会。没有默认值并且尚未在程序中被赋值的变量是未初始化的(uninitialized)。

如果试图访问未初始化的变量(例如,用 printf 显示变量的值,或者在表达式中使用该变量),可能会得到不可预知的结果,如 2 568、-30 891 或者其他同样没有意义的数值。在某些编译器中,可能会发生更坏的情况(甚至是程序崩溃)。

我们当然可以总是采用赋值的方法给变量赋初始值,但还有更简便的方法:在变量声明中加入初始值。例如,可以在一步操作中声明变量 height 并同时对其进行初始化:

1
int height = 8;

按照 C 语言的术语,数值 8 是一个初始化式(initializer)。

在同一个声明中可以对任意数量的变量进行初始化:

1
int height = 8, length = 12, width = 10;

注意,上述每个变量都有属于自己的初始化式。在接下来的例子中,只有变量 width 拥有初始化式 10,而变量 height 和变量 length 都没有(也就是说这两个变量仍然未初始化):

1
int height, length, width = 10;

六、显示表达式的值#

printf 的功能不局限于显示变量中存储的数,它可以显示任意数值表达式的值。利用这一特性既可以简化程序,又可以减少变量的数量。例如,语句

1
2
volume = height * length * width;
printf("%d\n", volume);

可以用以下形式代替:

1
printf("%d\n", height * length * width);

printf 显示表达式的能力说明了 C 语言的一个通用原则:在任何需要数值的地方,都可以使用具有相同类型的表达式。

(完)

comments powered by Disqus