C语言学习(一)

一、常用的数据类型

  32位系统与64位系统的同一数据类型占用大小可能不一致

数据类型存储大小(字节)值范围
char1-128 到 127 或 0 到 255
unsigned char10 到 255
signed char1-128 到 127
int2 或 4-32,768 到 32,767(2字节)或 -2,147,483,648 到 2,147,483,647(4字节)
unsigned int2 或 40 到 65,535(2字节)或 0 到 4,294,967,295(4字节)
short2-32,768 到 32,767
unsigned short20 到 65,535
long4 或 8-2,147,483,648 到 2,147,483,647(4字节)或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(8字节)
unsigned long4 或 80 到 4,294,967,295(4字节)或 0 到 18,446,744,073,709,551,615(8字节)
long long8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long long80 到 18,446,744,073,709,551,615
float41.2E-38 到 3.4E+38
double82.3E-308 到 1.7E+308
long double10, 12 或 163.4E-4932 到 1.1E+4932

  浮点数据类型中,float 的精度为6位有效位,double有15位有效位 。

二、变量

1.C中的变量声明

  变量不进行显式初始化时,默认值为0,指针变量则为NULL

2.变量声明与定义的区别

  在C语言中,变量声明用于告诉编译器变量的名称及其类型。变量声明不一定分配内存空间,它只是为变量提供了一种使用方式。变量声明可以发生在函数内部(局部变量)或函数外部(全局变量)。

  • 定义(Definition):变量定义时,编译器不仅知道变量的类型,还为变量分配了内存空间。定义通常伴随着初始化。

   例如:

int number = 10;

  这里的 number 既是定义,也是声明。编译器为 number 分配内存,并将其初始化为 10

  • 声明(Declaration):声明告诉编译器变量的类型和名称,但不分配内存。通常,声明用于在其他文件中引用变量,这时可以使用 extern 关键字。

      例如:

    extern int number;
      这里的 extern int number仅仅是声明,表示变量 number 在其他地方定义。

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

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

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

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

int g = 20;

  但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20;

三、常量

1.整数常量

  整数常量可由十进制、八进制、16进制表示,可带后缀U和L(不区分大小写),其中U代表无符号整数(unsigned),L代表长整数(long)。示例如下:

212         /* 合法的 */
215u        /* 合法的 */
0xFeeL      /* 合法的 */
078         /* 非法的:8 不是八进制的数字 */
032UU       /* 非法的:不能重复后缀 */

  各种类型的整数常量的实例:

85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* 整数 */
30u        /* 无符号整数 */
30l        /* 长整数 */
30ul       /* 无符号长整数 */

2.浮点常量

  使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。带符号的指数是用 eE引入的。浮点常量可以带后缀f
  几个浮点常量的实例:

3.14159       /* 合法的 */
314159E-5L    /* 合法的 */
510E          /* 非法的:不完整的指数 */
210f          /* 非法的:没有小数或指数 */
.e55          /* 非法的:缺少整数或分数 */

3.字符常量

  字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。

转义序列码表

转义序列含义
\\\ 字符
\'' 字符
\"" 字符
\?? 字符
\a警报铃声
\b退格键
\f换页符
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\ooo一到三位的八进制数
\xhh...一个或多个数字的十六进制数

四、定义常量

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

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

1.#define 预处理

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

#define 常量名 常量值

  例如

#define PI 3.14159

  在程序中使用该常量时,编译器会将所有的 PI 替换为 3.14159。

2.const关键字

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

const 数据类型 常量名 = 常量值;

  下面的代码定义了一个名为MAX_VALUE的常量:

const int MAX_VALUE = 100;

  在程序中使用该常量时,其值将始终为100,并且不能被修改。
在这里插入图片描述

3.#define于const区别

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

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

  • 替换机制#define 是进行简单的文本替换,而 const 是声明一个具有类型的常量。#define 定义的常量在编译时会被直接替换为其对应的值,而 const 定义的常量在程序运行时会分配内存,并且具有类型信息。

  • 类型检查#define 不进行类型检查,因为它只是进行简单的文本替换。而 const 定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。

  • 作用域#define 定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而 const 定义的常量具有块级作用域,只在其定义所在的作用域内有效。

  • 调试和符号表:使用 #define 定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用 const 定义的常量会在符号表中有相应的条目,有助于调试和可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值