[C语言] 常量与变量

简介: 常量其实就是在程序运行过程中不可以被改变的量叫做常量。常量是固定值,在程序执行期间不会改变。这些固定的值,又叫

什么是常量?

常量其实就是在程序运行过程中不可以被改变的量叫做常量。

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。

常量可以是任何的基本数据类型,比如整数常量(int)、浮点常量(float,double)、字符常量(char),或字符串字面值,也有枚举常量(enum)。

常量就像是常规的变量,只不过常量的值在定义后不能进行修改。

直接常量(字面常量)

整形常量可以理解为是直接使用的整形常数,如:123,456,-456,等......

整形常量可以是:长整型(long int)、短整形(short int)、有符号整形(signed int)、无符号整形(unsigned int)。

实型常量也称之为浮点型(单精度浮点型—float、双精度浮点型—double),由整数和小数部分组成,并用十进制(0~9)位组成的.

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

字符常量与之前所介绍的常量有所不同,即要对其字符型常量使用指定的定界符进行限制。

字符常量可以分为两种:1、字符常量(单个字符的单引号) 2、字符串常量(两个及以上双引号)

在这里注意一下:字符常量是区分大小写的、'A'和'a'的字符是不一样的!这两个字符代表不同的字符常量,' '这对单直撇代表着定界符号,不属于字符常量的一部分。在C语言中字符串常量时,系统会在字符串后面加"\0",作为字符串的结束标志,如图:

image.png

说明:系统会在字符串尾部添加一个字符串作为结束字符"\0",那么如图所示的长度实际上是6的原因!

字符串就是双引号""的内容叫做字符串,包含类似于字符常量的字符:普通的字符,转义序列和通用的字符。

转义字符

当然如果你觉得这个字符比较长的话其实也可以用空格符分开来,进行分析!在C语言中有些特定的字符,当它们有反斜杠的时候(\)就会具有特定的含义,如图所示:

image.png下面的实例显示了一些转义序列字符:

1. #include<stdio.h>
2. 
3. int main(void)
4. {
5. printf( "This\nis\na\ntest\n\nShe said, \"How are you?\"\n");
6. 
7. return 0;
8. }

打印结果:

image.png


定义常量

修饰常量的关键字是:const,被const关键字所修饰的变量,都是不能被改变的值。

const前缀声明指定类型的常量,如:const(关键字)int(数据类型)number(变量名) = 5(变量值)注意:在创建常量时候必须要设置它的初始值,下面就来举个例子:

1. const dobule PAL = 3.14159;    //正确的声明方式
2. const int MYLIST;              //错误的声明方式

你自己也可以用const关键字修饰下,然后再用变量改变常量值看看可不可以进行改变,我们这里PAL左边变量被const所给修饰的量,左值指定了const的对象,所以它是不能被修改的值。那么现在我们把PAL就叫做式常变量。那么为什么叫常变量呢?因为它具有常属性—常属性就是不能被改变的属性,但是其实它的本质上还是变量!举个例子给大家看下:所以还是叫做常变量!所以在这里我们只能用#define标识符来进行常量的修饰

image.png

当然用const关键字修饰的话知识一种常量的修饰方式,实际上还有另外一种的修饰能够定义常量那就是用 #define 预处理编译器也是可以定义常量方式的一种方式。

下面举出一个习题:定义符号常量#define,用这个来打印自己的出生日期

#include<stdio.h>   
#define YEAR 2005
#define YUE  4
#define DAY  28
int main(void) 
{
  printf("我的出生日期是:%d年%d月%d日\n",YEAR,YUE,DAY);
  return 0; 
}
  • 请注意:把常量定义成一个大写是一个很好的习惯!
  • 除了上面所讲述的还有一种常量被称之为:枚举常量 — 可以①①列举的常量 如下示例
#include<stdio.h>
enum color
{
  //枚举常量
  black,
  white,
  gules,
};
int main(void)
{
  //从零开始打印
  enum color max = black;
  printf("%d\n", black);
  printf("%d\n", white);
  printf("%d\n", gules);
  return 0;
}

运行结果:

什么是变量?

变量其实就是在程序运行过程中不可以被改变的量叫做变量。

其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。

变量定义必须放在变量使用之前。一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。

变量顾名思义是可以发生改变的,当你定义一个变量的时候的值,到后面你想改变它的值还是可以发生改变的。

变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。

变量的定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。

变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。如下所示:

type variable_list;这里的 type 必须是要一个有效的C语言当中的数据类型,variable_list 可以是由一个或者多个C语言中标识符组成,如下实例:

int a,b,c;
char e,f,d;
float h_list;
double numbers;

变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:

type variable_name = value;下面举个例子:

extern int d = 3, f = 5;    // d 和 f 的声明与初始化
int d = 3, f = 5;           // 定义并初始化 d 和 f
byte z = 22;                // 定义并初始化 z
char x = 'x';               // 变量 x 的值为 'x'

变量声明

变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。

变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。

变量的声明有两种情况:

一种是需要建立存储空间的,例如:int a 在声明的时候就已经建立了存储空间。

另一种是不需要建立存储空间的,通过使用 extern 关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。

extern 的作用:告知编译器变量在当前范围之外声明过了,被 extern 语句描述过的变量将分派不到任何空间,因为他们在别的地方被定义过了。

extern int number;// 声明,没有定义!

int number;           // 声明,定义了!

变量的使用

如下实例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
  int a, b;
  int sum = 0;
  printf("第一个数字:");
  scanf("%d",&a);
  printf("第二个数字:");
  scanf("%d", &b);
  sum = a + b;
  printf("sum = %d\n",sum);
  return 0;
}

extern用法  

如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可!

如果这个程序没有extern关键字的话,程序就会报错,因为它们找不到变亮的值🧨

在这段代码中运用到了一个全局变量的知识,在这里跟大家说下:

在所有的函数外部定以的变量叫做:全局变量。

全局变量是可以在整个程序当中进行使用的。

当然在程序当中我们尽量在代码当中少用到全局变量比较。

注意:当局部变量和全局变量同名的话,局部变量的使用优先!

#include <stdio.h>
/*外部变量声明*/
extern int x;    
extern int y;
int addtwonum()
{
    return x+y;
}
//全局变量的声明
int x = 1;
int y = 2;
int main(void)
{
    int result;
    result = addtwonum();
    printf("result 为: %d\n",result);
    return 0;
}

C 中的左值(Lvalues)和右值(Rvalues)

C 中有两种类型的表达式:

左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。

右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int age = 17;

但是下面的这个就是错误的,会生成编译器上的错误!

20 = 10;

作用域和生命周期

所谓的作用域就是☞变量起到作用的范围,也就是变量的有效范围。变量按作用域可以分为两种:局部变量和全局变量💨

作用域规则:

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

在函数或块内部的局部变量

在所有函数外部的全局变量

在形式参数的函数参数定义中

局部变量

在一个函数内部声明的变量是内部变量,它只在本函数内部有效,在本函数之外是不能使用的,这样的变量就是局部变量。

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。

如下实例:

#include <stdio.h>
int main(void)
{
  //局部变量声明 
  int num1, num2;
  int sum;
  //实际初始化
  num1 = 10;
  num2 = 20;
  sum = a + b;
  printf ("num1 = %d, num2 = %d 以及 sum = %d\n", num1, num2, sum);
  return 0;
}

全局变量

在函数外部声明的就是全局变量,全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。

  • 如下实例:
#include <stdio.h>
/* 全局变量声明 */
int sum;
int main ()
{
  /* 局部变量声明 */
  int a, b;
  /* 实际初始化 */
  a = 10;
  b = 20;
  sum = a + b;
  printf ("sum = %d",sum);
  return 0;
}

形式参数

函数参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。

  • 如下实例:
#include <stdio.h>
/* 添加两个整数的函数 */
int sum(int a, int b)
{
  printf("value of a in sum() = %d\n", a);
  printf("value of b in sum() = %d\n", b);
  return a + b;
}
/* 全局变量声明 */
int a = 20;
int main(void)
{
  /* 在主函数中的局部变量声明 */
  int a = 10;
  int b = 20;
  int c = 0;
  int sum(int, int);
  printf("value of a in main() = %d\n", a);
  c = sum(a, b);
  printf("value of c in main() = %d\n", c);
  return 0;
}
  • 运行结果:

image.png

生命周期

  • 局部变量的生命周期:进入局部范围的生命开始,出局部范围的生命结束!
  • 全局变量的生命周期:程序的生命周期,这个程序从开始到结束都可以进行使用!
目录
相关文章
|
24天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
47 12
|
1月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
155 11
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
45 7
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
36 5
|
1月前
|
C语言
【C语言】<常量> 之群英荟萃
在C语言中,常量(Constants)是指在程序运行过程中其值不能被修改的固定值。常量包括数值常量(整型和浮点型)、字符常量、字符串常量、使用const关键字定义的常量变量以及枚举常量。
33 4
|
1月前
|
编译器 C语言
【C语言】常量的 “前缀和后缀” 大通关!
在C语言中,常量的前缀和后缀用于明确指定常量的类型和进制系统。前缀主要用于区分不同进制的数字常量,而后缀则用于区分不同类型的整数和浮点数。正确使用前缀和后缀,可以提高代码的可读性和可维护性,确保编译器正确地理解和处理常量。
39 1
|
3月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
60 1
|
3月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
3月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
3月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)