你好,C语言
上QQ阅读APP看书,第一时间看更新

2.3 变量和常量

在C语言中,变量和常量是非常重要的概念。本节首先简单介绍变量和常量的概念,第3章将会对其进行更加详细的解析。

1.变量

在2.2节中,我们编写了一个add函数,该函数返回两个整数相加的结果。那么,返回的结果将存储在哪里呢?我们如何使用这个结果?

为了接收add函数返回的值,我们需要使用一个“东西”,即变量。在调用add函数之前,我们声明一个int类型的变量result,并将其初始化为空值。这可以通过以下两行代码实现。

int result;
result = add(2, 3);

变量可以看作一个可以存储特定类型的值的容器,其中的值可以在程序运行过程中被改变。例如,可以将一个整数存储在整型变量中,并在程序中更改该变量的值。

result只是我们为这个变量起的一个名字,你可以给它起任何名字。例如,你可以将其命名为he或xiangzi。

然后,我们将add函数返回的结果5存储在result中,因此result中的值现在是5。“=”是C语言中的赋值运算符,它的作用是将右侧的值赋给左侧的变量。就像函数一样,C语言中的等号和数学中的等号有很大的不同,它并不表示相等。

图2.21展示了add函数调用过程的解析。可以看到,使用了add函数计算2和3的和,运算后返回结果5,之后在main函数中通过赋值运算符=将该结果赋给result。

图2.21 add函数调用过程的解析

再次思考,我们是否可以删除int result;一行代码,并将其更改为程序清单2.5的代码?

程序清单 2.5

int main()
{
   result = add(2, 3);
   printf("%d", result);
   return 0;
}

答案是否定的,因为变量在使用之前必须进行声明。

如果删除了int result;一行代码,就表示没有对变量result进行声明。编译器由于在看到result名称时没有看到result的定义,因此无法确定它是什么类型的变量,甚至有可能不是变量而是一个函数。这样,编译器只能给出一个编译错误的提示并结束编译。

int result;

因此,我们必须像上面那样,声明一个名称为result、类型为int的变量。接下来,编译器就可以记录result是一个int类型的变量。在后面的代码中,我们就可以顺利地使用这个result变量了。

2.标识符

标识符是由我们自己起名字的,用于表示一个变量、函数或其他实体的名称。例如,我们将函数命名为add意味着该函数的作用是加法,而将变量命名为result意味着该变量存储的是函数的返回值。

在使用标识符之前,必须对其进行声明或定义,以便编译器识别该标识符。编译器如果遇到未定义或声明的标识符,则会报错,因为它无法理解该标识符表示的实体。

在C语言中,标识符可以任意命名,但必须遵循以下规则。

(1)标识符可以由小写字母、大写字母、数字和下画线组成。

(2)标识符的第一个字符必须是字母或下画线,不能是数字。

(3)标识符是区分大小写字母的。

3.关键字

再思考一个问题,int是一个标识符吗?

答案是否定的。这是因为int并不是我们随意命名的,并且int并不是任何实体的名称。int是C语言中的一个关键字。

关键字是在C语言的语言规范中规定的,具有特殊的意义和用途,不能随意命名。

因此,我们需要区分标识符和关键字的概念。标识符是用户自定义的,用于指代某一个实体的名称;关键字是语言规范中规定的,不能作为标识符使用。

C语言中的所有关键字如表2.1所示。

表2.1 C语言关键字

4.常量

在调用add函数时,我们传入了参数2和3,那么是否需要声明数值2和3吗?

答案是不需要。因为像数值2和3这样的常量不需要被声明,因为它们是不可变的,不能被代码修改。一旦它们出现在代码中,就默认它们是整型int类型的常量。

同样,字符串常量也不需要被声明,如"Hello World\n"。字符串常量需要用双引号括起来,这是与数值的区别。

变量是可以通过赋值进行修改的,但常量是不能被修改的。因此,以下两种写法都是不正确的。

2 = 3;              // 错误
"Hello" = "World";  // 错误

注意:

在字符串常量"Hello World\n"中,有一个"\n",它是一个换行符,在代码中表示换行,当遇到该符号时,输出内容将在当前行结束并转到下一行。