C语言中的变量与常量

1. 变量与常量

在整个程序的运行过程中,没有变化且不能变化的,我们称之为常量。

在程序运行期间,可以改变并且有可能会改变的,我们称之为变量。

2. 声明变量

在前几章中,我们已经接触过如何声明一个变量了:

short s;
int n;
long l;
float f;
double d;

声明变量的公式:类型 + 标识符 + 封号

标识符:由我们自己命名的一个标识,用于表示一个变量、函数或其他实体的名称。例如:上面的代码中s,n,l,f,d是由我们自己命名的一个标识,用于表示一个变量。

关键词:在语言标准中规定词汇,并且在代码中有特殊意义和用途。例如:short,int,long,float,double都是表明变量的类型,它们是由语言标准中提供的词汇。

标识符必须经过声明或定义才能正常被编译器识别,而关键词可以直接使用。

因此,要让标识符被编译器看做是一个变量,必须将标识符在使用前声明为一个变量。

接下来我们举几个例子:

正确, 变量使用前被声明了。

//  正确
#include <stdio.h>
int main()
{
    int a;
    printf("%d\n", a); //  正确, 变量使用前被声明了。
    return 0;
}

错误, 变量a未声明。

//  错误
#include <stdio.h>
int main()
{
    printf("%d\n", a); //  错误, 变量未声明。
    return 0;
}

错误, 变量a在声明前使用。

//  错误
#include <stdio.h>
int main()
{
    printf("%d\n", a); //  错误, 变量在声明前使用。
    int a;
    return 0;
}

3. 变量名命名规则

声明变量的公式:类型 + 标识符 + 封号

既然变量名是一个标识符,因此变量名必须符合标识符的命名规则。

标识符命名规则:标识符由大小写字母,数字和下划线组成。标识符不能以数字开头,并且必须与现有的关键词不同。

short apple; 正确
int 88fruit; 错误,不能以数字开头
long _pencil; 正确,可以以下换线或字母开头
float love_you; 正确,字母开头,标识符可以使用下划线
double int; 错误,不能与现有关键词相同

4. 变量初始化和赋值

4.1 初始化和赋值

我们思考一下,下面的代码,它的打印出来的数值是多少呢?

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

我们发现,它居然报错了!

因为变量a没有被装入任何确定的值,它就被使用了。现在它的值是一个随机值,这样的随机值会导致程序产生错误的结果。

因此,在Visual Studio 2019中默认设置下,使用这种变量是无法通过编译的。

我们需要为变量a装入确定的值,可以通过两种方法实现:

  1. 变量声明后立刻初始化。
  2. 变量先声明,其后再为变量赋值。

写法1:变量声明后,立刻初始化。

#include <stdio.h>
int main()
{
    int a = 100; //  变量声明后,立即装入100。
    printf("%d\n", a); 
    return 0;
}

写法2:变量声明后,不初始化。后续使用赋值运算符赋值。

#include <stdio.h>
int main()
{
    int a; //  变量声明后,为一个随机值
    a = 100; // 这里我们使用赋值运算符,将100给了a。
    printf("%d\n", a); 
    return 0;
}

4.2 初始化和赋值的区别

请注意:变量可以多次赋值,但是不能被多次初始化。

多次初始化的写法相当于将变量a声明了两次,在第二次声明变量a时,编译器发现标识符a已经被使用过了,便会报告一个编译错误。

//  正确,将输出100,200。
#include <stdio.h>
int main()
{
    int a; 
    a = 100; 
    printf("%d\n", a); 
    a = 200;
    printf("%d\n", a); 
    return 0;
}
//  错误,变量a被重复声明。
#include <stdio.h>
int main()
{
    int a; 
    a = 100; 
    printf("%d\n", a); 
    int a = 200; 
    printf("%d\n", a); 
    return 0;
}

目前看来,初始化好像就是把变量声明和赋值写在一行了,对于整型和浮点变量确实如此。

但是,对于后面将见到的其他类型,会略有不同。请区别对待初始化和赋值,这两个概念。

5. 常量

字面常量是程序中,一开始就被写死在代码中,且不能被改变的量。

5.1 字面常量

例如:100,200,1.3344,"HelloWorld",被称之为字面常量。

100 = 101;
错误,常量不能被更改
100 = a;
错误,常量不能被更改

被双引号包裹的称之为字符串字面常量。

"HelloWorld"
"HelloWorld" = "你好";
错误,常量不能被更改

5.2 字面常量类型

一个变量的类型在声明的时候被确定。而一个常量的类型,在这个常量写在代码中时也能被确定。

整数字面常量通常是int类型的,除非这个整数字面常量数值过大,超过了int类型的范围,那么这个常量会被看做是long类型。如果更大,那么依次类推为更大范围的整型类型。

带小数的字面常量为double类型。

5.3 符号常量

假设我们有一个商品的价格price,目前为3元。现在我们要计算,10件这个商品的价格。

#include <stdio.h>

# define PRICE 3

int main()
{
	int num = 10;
	int total;
	total = num * PRICE;
	printf("total:%d", total);
	return 0;
}

我们并没有直接写num * 3,而是定义了一个符号常量PRICE。这样做有什么好处呢?

比如,我们这个程序很庞大,商品的价格不仅仅被用在main函数中,还被用在其他很多函数里面。

如果有一天,这个商品的价格改变了。那么我们就需要到每一个使用过的地方进行修改,这样修改起来会非常麻烦。

但是,我们把商品的价格定义为符号常量,这样只需要修改这个符号常量所代表的值即可。

定义符号常量的公式:

#define 符号常量 值

默认分类 2022-03-01 01:42:28 通过 网页 浏览(1578)

共有0条评论!

发表评论