首页 > 其他分享 >【C语言】变量和常量

【C语言】变量和常量

时间:2024-09-07 21:23:09浏览次数:10  
标签:字符 const 常量 int C语言 变量 define

文章目录

一.变量与常量的概念

在C语言编程中,理解变量与常量的概念是基础且关键的一步,它们是数据存储和操作的核心。

1.1变量

变量是程序中用于存储数据值的标识符,其在程序执行过程中的值是可以改变的。每个变量都有一个数据类型,它定义了变量存储的数据种类(如整数、浮点数、字符等)以及占用的空间大小。

特点:

  • 可变性:变量的值在程序运行时可以被改变。
  • 不可变性:变量所占的存储单元地址可以随时改变,一个变量实质上代表了内存中的某个存储单元。
  • 类型性:变量声明时必须指定数据类型。
  • 标识性:变量通过唯一的标识符(变量名)进行访问,即程序中用到的所有变量名都必须有一个名字作为标识,变量的名字是由用户定义,它必须符合标识符的命名规则。

示例:

int age = 25; // 声明一个整型变量age,并初始化为25
age = 26; // 更新age变量的值为26

1.2常量

常量是一种在程序定义后其值不能被修改的标识符。在C语言中,常量可以是直接量(如字面常量5'a'),也可以是通过#define预处理指令或使用const关键字定义的命名常量。

特点:

  • 不变性:一旦定义,常量的值不可更改。

  • 类型性:常量具有确定的数据类型。

  • 标识性:命名常量通过唯一的标识符进行访问。

    示例:

#define MAX_SIZE 100 // 使用#define定义的常量
const int minSize = 10; // 使用const关键字定义的整型常量

1.3变量与常量的比较

虽然变量和常量在使用中都承担着数据存储的角色,但它们在数据的可变性上有本质的区别。变量的值在程序运行时可以改变,适用于存储计算过程中可能变化的数据;而常量的值一旦定义就不可更改,适用于存储不变的数据,如配置参数、状态码等。

那么,选择变量还是常量?

在实际编程中,合理选择使用变量或常量对于提高代码的可读性和维护性非常重要。一般原则是:

  • 当数据值需要在程序执行过程中改变时,使用变量。
  • 当数据值固定不变,或者你希望保护该值不被意外修改时,使用常量。

二.变量

在C语言中,变量声明是程序中定义变量的过程,它告诉编译器变量的名称,类型以及可能的初始值。正确声明和使用变量是编写高效,可维护C程序的关键。

2.1变量声明

声明变量时,必须指定变量的类型和名称。基本的变量声明语法如下:

type variable_name;
  • 类型(type):变量的数据类型,如intfloatchar等。
  • 变量名(variable_name):变量的标识符,用于在程序中引用该变量。

示例:

int age;
float salary;
char grade;

2.2变量初始化

在声明变量时,可以同时为其赋初值,这称为变量的初始化。初始化语法如下:

int age=25;
float salary=4500.50;
char grade = 'A';

初始化变量有助于程序的可读性,并可以防止未初始化变量的潜在错误。

2.3命名规范

选择有意义的变量名是良好编程风格的重要部分。以下是一些命名变量时的建议:

  • 使用有描述性的名称,使变量的用途清晰。
  • 避免使用单字母变量名,除非在短小函数或循环中。
  • 对于多个单词的变量名,可以使用下划线分隔(snake_case)或驼峰命名法(camelCase)。

2.4变量作用域

变量的作用域决定了在程序的哪个部分可以访问该变量。C语言中主要有两种作用域:

  • 局部变量:在函数或块内声明的变量,只能在其声明的函数或块内访问。
  • 全局变量:在所有函数外部声明的变量,可以在程序的任何地方访问。

合理安排变量的作用域,可以提高程序的模块化和减少变量冲突。

2.5使用const限定符

使用const限定符可以定义常量变量,即一旦赋值后就不允许更改的变量。这对于需要保护的值非常有用。

const int MAX_AGE=100;

三.常量

常量可以是任何的基本数据类型,比如整数常量,浮点常量,字符常量,或字符串常量,也有枚举常量。

3.1整数常量

整数常量可以是十进制,八进制或十六进制的常量,前缀指定基数:Ox或OX表示十六进制O表示八进制不带前缀则默认表示十进制。整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数(unsigned),L表示长整数(long),后缀可以是大写,也可以是小写,U和L的顺序任意。

212合法

215u合法

OXFeeL合法

O78非法:8不是八进制的数字

O32UU非法:不能重复后缀

3.2浮点常量

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

当使用小数形式表示时,必须包含整数部分,小数部分,或者同时包含两者。

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

3.14159合法

314159E-5L合法

510E非法:不完整的指数

210f非法:没有小数或指数

.e55非法:缺少整数或分数

以字母e或E代表以10为底的指数,需要注意的是e和E之前必须要有数字,且e和E后面必须为整数。例如:

12.34e3表示12.34*10^3

-67.89e-16表示-67.89*10^-16

后缀F/f表示该常数用浮点方式存储,相当于float

3.3字符常量

字符常量是括在单引号中,例如,'x’可以存储在char类型的简单变量中。

字符常量可以是一个普通的字符(例如’x’)、一个转义序列(例如’\t’)或一个通用的字符(例如’\u02C0’)。未赋值的系统自动补全为’\0’

(1)普通字符常量:用单引号括起来的一个字符,如’a’ , ‘B’ , ‘3’ , ‘@’ , ‘#’.不能写成’ab’或’12’.注意单引号只是个界限符,字符是指用单引号括起来的符号,不包括单引号。字符型在内存中是以ASCII码形式存储的,例如字符’a’的ASCII码的十进制为97(A为65),在存储单元中存放的是97的二进制形式。

(2)转义字符:C语言中还有一种特殊形式的字符常量,是以字符\开头的字

转义序列含义
\\字符
'字符
""字符
??字符
\a警告提示音
\b退格删除符
\f换页符
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\o八进制形式
\x十六进制形式
\ooo一到三位的八进制数
\xhh…一个或多个数字的十六进制数
  • 字符常量的ASCII值可以通过强制类型转换转换为整数值。例如:

    char myChar='a';
    int myAsciiValue=(int)myChar;//将myChar转换为ASCII值 97
    

3.3字符串常量

字符串常量是括在双引号中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。

可以使用空格做分隔符,把一个很长的字符串常量进行分行。

下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。

"hello,dear"
    
"hello,\
dear"
    
"hello," "d" "ear"

字符串常量在内存中以null终止符\0结尾。例如:

char myString[] = "Hello,world!";//系统对字符串常量自动加一个 '\0'

3.4地址常量

每一个常量、变量、数组的地址在程序运行期间是不能够改变的,称为地址常量。

定义的变量,在内存中有地址,这个地址是常量。

C语言中如何取一个常量的地址?

在C语言中,常量通常是通过#define指令或者const关键字定义的。由于常量的值在程序运行期间不会改变,因此直接取常量的地址在某些情况下会导致错误。&是取地址运算符,只能对变量直接取地址,不能对常量直接取地址。在C语言中,取一个常量的地址的方法是:使用指针、将常量赋值给一个变量、使用const关键字。其中最常见的方法是通过将常量赋值给一个变量,然后取这个变量的地址。下面详细描述这一方法。

  1. 通过变量取常量的地址

    #include <stdio.h>
    #define PI 3.14159
    int main() {
        float pi_value = PI;  // 将常量的值赋给变量
        float *pi_ptr = &pi_value;  // 取变量的地址
        printf("PI value: %fn", pi_value);
        printf("Address of PI: %pn", (void*)pi_ptr);//通过指针访问地址,常量没有返回值,用void类型的指针
        return 0;
    }
    //输出:PI value: 3.141590nAddress of PI: 000000000062FE14n
    
  2. 使用const关键字和指针

    可以使用const关键字定义一个常量,然后直接使用指针指向它:

    #include <stdio.h>
    int main() {
        const int num = 100;
        const int *num_ptr = &num;  // 使用指针指向常量
        printf("Value of num: %dn", num);
        printf("Address of num: %pn", (void*)num_ptr);//通过指针访问常量的值,常量没有返回值,用void类型的指针
        return 0;
    }
    //输出:Value of num: 100nAddress of num: 000000000062FE14n
    
  3. 使用指针访问常量

    通过指针访问常量的值可以提供更大的灵活性,特别是在需要通过函数传递常量时。以下是一个具体的例子:

    #include <stdio.h>
    void print_constant(const int *ptr) {
        printf("Value of constant: %dn", *ptr);
    }
    int main() {
        const int num = 50;
        print_constant(&num);  // 常量num的地址被传递给函数printf_constant,并通过指针访问常量的地址
        return 0;
    }
    //输出:Value of constant: 50n
    

    上面的代码还可以写成:

    #include <stdio.h>
    void print_constant(const int *ptr) {
        printf("Value of constant: %dn", *ptr);
    }
    int main() {
        const int num = 50;
        const int* p=&num;//使用指针指向常量
        print_constant(p);  //将该指针传递给函数
        return 0;
    }
    

3.5定义常量

在 C 中,有两种简单的定义常量的方式:

  1. 使用 #define 预处理器: #define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。
  2. 使用 const 关键字:const 关键字用于声明一个只读变量,即该变量的值不能在程序运行时修改。

注意:把常量定义为大写字母形式是一个很好的编程习惯

#define预处理器

下面是使用#define预处理器定义常量的形式:

#define identifier value

实例:

#include<stdio.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main(){
    int area;
    area=LENGTH*WIDTH;
    printf("value of area:%d",area);
    printf("%c",NEWLINE);
    return 0; 
}

const关键字

可以使用const前缀声明指定类型的常量,如下所示:

const type variable=value;

实例:

#include<stdio.h>
int main(){
    const int LENGTH=10;
    const int WIDTH=5;
    const char NEWLINE='\n';
    int area;
    area=LENGTH*WIDTH;
    printf("value of area:%d",area);
    printf("%c",NEWLINE); 
    return 0; 
}

#define与const区别

#define 与 const 这两种方式都可以用来定义常量,选择哪种方式取决于具体的需求和编程习惯。通常情况下,建议使用 const 关键字来定义常量,因为它具有类型检查和作用域的优势,而 #define 仅进行简单的文本替换,可能会导致一些意外的问题。

#define 预处理指令和 const 关键字在定义常量时有一些区别:

  1. const常量是在编译时分配内存,而#define是在预处理时进行文本替换,不会分配内存。
  2. const常量有类型,可以进行类型检查,而#define没有类型,只是简单的文本替换。
  3. const常量可以进行地址取值操作,而#define不可以。
  4. const常量可以在多个文件中共享,而#define只能在定义它的文件中使用。
  5. const常量可以进行调试,而#define不可以。

因此,建议在定义常量时优先使用const,而不是#define。

标签:字符,const,常量,int,C语言,变量,define
From: https://blog.csdn.net/2301_79279099/article/details/142004654

相关文章

  • c语言编译器IDE英汉翻译词典程序代码
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>typedefstruct{charenglish[50];charchinese[50];}WordTranslation;intmain(){intx;intn,g=1;while(g){n=0;WordTranslationtranslations[......
  • 使用libmpg123加alsa实现MP3的播放/暂停,切换,模式选择,C语言3
    note:使用多线程的方式MP3实现播放器,其中用到libmpg123,以及asound库,解码用到libmpg123,播放用到alsa,以下为c语言例程源码#include<alsa/asoundlib.h>#include<mpg123.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>#include&l......
  • 鹏哥课程三子棋 全码C语言
    代码来自在b站上的鹏哥的课程,大部分为手打,少部分直接搬运了csdn博客其他学习者的代码。该三子棋代码内容全免费。这篇文章仅提供给认真上课的学习者参考使用,经过测试该代码能够正常运行使用。前言唯一美中不足的是,在开始游戏界面如果输入下棋坐标,会导致死循环。共包含三篇,......
  • 【C语言基础】赋值、输入与输出
    1语句及赋值语句1.1C语句分类表达式语句:表达式加分号。函数调用语句:函数名及其参数加上分号。如:printf("Helloworld!");空语句:只有分号";"组成。控制语句条件判断语句:if语句,switch语句循环语句:while语句,dowhile语句,for语句转向语句:break语句,continue语句,goto语句,retu......
  • 【C语言基础】数组
    1一维数组1.1定义类型说明符数组名[常量表达式];如:inta[10];这里,a是数组变量名,10表示数组a中包含的元素个数,int是数组a中元素的类型。数组a的元素序号为0,1,2,3,4,5,6,7,8,9,各序号对应的元素为a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。1.2初始化类......
  • C语言 ——— #define 定义宏
    目录何为宏宏的声明及其使用方式宏中的括号是否多余何为宏#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称宏宏的声明及其使用方式声明代码演示:#defineMAX(x,y)((x)>(y)?(x):(y))使用代码演示:inta=3;intb=5;intmax=MAX(a,b);代......
  • 重生之霸道C语言爱上我之走入指针(3)
    根据前两篇与指针的初步接触后,我们已经了解到了指针里面最基本的知识,而接下来的文章,将会更注重于指针的深入理解和运用。1.数组名的理解1.1arr,即一个数组的数组名的理解在上一篇文章1.1里面的代码中,我们在用指针访问数组内容的时候,有这样的代码:intarr[10]={1,2,3,4,5,6......
  • 1.Java基础变量和数据类型练习题
    我写的都是键盘录入,运行没结果,不妨按几下试试 1.输出个人简历packagecom.hz.test01;publicclassZuoye{ publicstaticvoidmain(String[]args){ //inti=0;整形 //byteb=0;字节类型 //shorts=0;短整型 //longl=20l;长整型 //floatf=3.33F;单精度......
  • C语言常量和字面量
    目录引言1.字面量1.1字符字面量1.2整型字面量1.3浮点字面量2.常量2.1使用预处理器指令#define定义常量2.1.1语法格式2.1.2使用举例2.2使用const关键字定义常量2.3使用#define和const定义常量的区别引言        字面量是直接在代码中......
  • 全国计算机二级考试C语言篇3——选择题
    C语言部分——C语言概述1.程序模块化的优点程序模块化的优点在于它可以使程序的开发、维护和复用变得更简单。下面是一些主要的优点:降低复杂度:模块化可以将复杂的问题分解成更小的、更易管理的部分。可维护性:模块化使得代码更易于维护,因为修改一个模块的影响被限制在该......