前端学习C语言,常量运算符控制和循环有哪些用法?
摘要:## 常量、运算符、控制和循环 前文我们写了第一个 c 语言程序,了解了基本的数据类型。本篇将继续学习:`常量`、`运算符`、`控制语句`和`循环语句`。 ### 常量 #### #define 常量 `#define`是用来定义`常量`和
常量、运算符、控制和循环
前文我们写了第一个 c 语言程序,了解了基本的数据类型。本篇将继续学习:常量、运算符、控制语句和循环语句。
常量
#define 常量
#define是用来定义常量和宏的预处理指令。定义常量的一般形式:#define 常量名 常量值。就像这样:
#define MAX_NUM 100 // 定义整型常量 MAX_NUM 并初始化为 100
#define PI 3.1415926 // 定义双精度浮点型常量 PI 并初始化为 3.1415926
使用 #define 宏定义所定义的常量是不可修改的(const 定义的能被修改),编译器在编译时会将所有代码中用宏定义表示的常量进行替换的操作,即文本替换。这意味着,程序在运行时并没有存储这些常量的值,而是直接使用它们的值来进行计算。例如,以下代码中:
#define MAX_NUM 100
int arr[MAX_NUM]; // 这里的 MAX_NUM 在编译时会被替换成 100
在编译期间,编译器会将代码中的 MAX_NUM 替换成 100,因此程序实际上是使用整数值 100 来声明数组 arr 的大小。
const
const 关键字所定义的常量是可以被修改的。虽然 const 常量不能作为左值(即不能出现在赋值语句的左边),但是通过指针可以修改其所指向的变量的值。请看示例:
#include<stdio.h>
int main() {
// 使用 const 关键字定义一个常量
const int val =5;
// 使用指针访问该常量
int *ptr= (int*)&val;
*ptr=10;// 修改存储单元的值
printf("val = %d\n",val);// 输出:val = 5
printf("*ptr = %d\n", *ptr);// 输出:*ptr = 10
return 0;
}
虽然我们通过指针访问了 val 的存储单元并将其中的值修改为了 10,但是 val 的值仍然是 5,这是因为 val 被定义为一个 const 常量,所以编译器会对其进行优化。具体来说,编译器可能会在程序中使用 val 的地方直接替换成常量 5,而不是实际读取 val 所在的存储单元的值。这样做可以提高程序的效率。
Tip:我们应该遵守 const 常量的规定,不要尝试通过任何方法来修改 const 常量。
const vs #define
在定义常量时,使用#define和const关键字都可以实现相同的功能,但是建议优先使用 const 关键字来定义常量。原因如下:
1.类型安全:const 常量有具体的类型信息,而使用 #define 宏定义常量是不具备类型信息的。在使用 #define 定义常量时,如果某个常量错误地被用于另一种数据类型的处理过程中,编译器无法发现这样的错误。而使用 const 常量定义常量可以有效避免这种类型错误。
1. 可读性和可维护性:通过使用 const 来定义常量,可以使代码更加清晰和易于阅读,降低出错率,并且增强了程序的可维护性。相比之下,使用 #define 宏定义的常量只是简单的文本替换,执行代码后看不到定义的常量值,容易对程序的可读性造成影响,难以维护和扩展。
1.编译器优化:对于 const 常量,编译器会将其存放在内存的只读区域,从而避免了意外修改它们的值。而使用 #define 宏定义的常量只是简单的文本替换,这意味着编译器无法进行优化。
1.作用域:const 常量定义的作用域只局限于定义的文件和其他使用该声明的文件,不影响其他文件中的变量。而 #define 宏定义常量的作用域是全局的,容易导致重名等问题。
因此,总体来说,使用 const 关键字定义常量可以使代码更加清晰、安全、易于维护,并且可以得到编译器的优化作用,建议优先使用 const 来定义常量。
数值常量类型
十进制整数常量:
123// 常量值为 123,默认是 int 类型
-456// 常量值为 -456,也是 int 类型
1776L// 常量值为 1776,长整型
进制整数常量:以数字 0 到 7 组成,必须以 0 开头,可以带有前缀 0 和同样的标志。
