Bootstrap

【C语言】一篇速通常量变量

什么是常量?

直接常量(字面常量)

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

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

转义字符

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

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

#include

int main(void)
{
    printf( "This\nis\na\ntest\n\nShe said, "How are you?"\n");

    return 0;
}

打印结果:

定义常量

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

const 前缀声明指定类型的常量,如:const(关键字)int(数据类型)number(变量名) = 5(变量值)

注意:在创建常量时候必须要设置它的初始值,下面就来举个例子:

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

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

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

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


#include   
 
#define YEAR 2005
#define YUE  4
#define DAY  28
 
int main(void) 
{
  printf("我的出生日期是:%d年%d月%d日\n",YEAR,YUE,DAY);
  return 0; 
}

  • 请注意:把常量定义成一个大写是一个很好的习惯!

  • 除了上面所讲述的还有一种常量被称之为:枚举常量 — 可以①①列举的常量 如下示例

#include
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'

不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。

变量声明

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

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

  • 变量的声明有两种情况:

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

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

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

变量的使用

如下实例:

#define _CRT_SECURE_NO_WARNINGS 1
#include

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 
/*外部变量声明*/
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 中有两种类型的表达式:

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

int age = 17;

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

20 = 10;

作用域和生命周期

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

作用域规则:

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

局部变量

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

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

  • 如下实例:

#include 
 
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 
/* 全局变量声明 */
int sum;
int main ()
{
  /* 局部变量声明 */
  int a, b;
 
  /* 实际初始化 */
  a = 10;
  b = 20;
  sum = a + b;
 
  printf ("sum = %d",sum);
 
  return 0;
}

形式参数

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

  • 如下实例:

#include 
/* 添加两个整数的函数 */
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;
}
  • 运行结果:

生命周期

  • 局部变量的生命周期:进入局部范围的生命开始,出局部范围的生命结束!

  • 全局变量的生命周期:程序的生命周期,这个程序从开始到结束都可以进行使用!