目录:
() c语言变量
1 .变量定义
示例:
2 .变量初始化
示例:
3 .变量声明
示例:
变量定义和声明之间的区别:
4.C语言的左值(Lvalues )和右值(Rvalues ) )。
5 .变量的内存寻址(与系统相关) ) )。
) ) c语言常数
1 .常数的定义
2 .整数常数
常量实例:
不同类型整数常量的实例:
3 .浮点常数
浮点常量实例:
4 .文字常数
转义序列:
5 .字符串常量
示例:
6 .定义常数
1 .常数的定义方法
2.#定义预处理器
实例:
3 .常数关键字
实例:
4 .常数和定义的区别
(1)编译器的处理方式不同
)2)类型与安全检查不同
)3)记忆方式不同
)4) const可以节约空间,避免不必要的内存分配
示例:
)5)提高效率
)6)宏置换只进行置换,不进行计算,不进行公式求解
() c语言变量
变量的名称可以由字母、数字和下划线字符组成。
必须以字母或下划线开头。
字母和小写字母不同。 c是因为大小写敏感。
1 .变量定义
类型variable _ list;
说明:
类型必须是有效的c数据类型。 可以是char、w_char、int、float、double或任何用户定义的对象
variable_list可以由一个或多个标识符名称组成
多个标识符之间用逗号分隔。
示例:
int i,j,k;
char c,ch;
浮动f,销售;
双精度d;
2 .变量初始化
类型variable _ name=value;
示例:
扩展输入f=5,f=5; //d和f的声明和初始化
int d=3,f=5; 定义并初始化//d和f
byte z=22; 定义并初始化//z
char x='x '; //变量x的值为' x '
3 .变量声明
变量的声明有以下两种情况:
1、一个需要创造存储空间
例如,int a在声明时已经创建了存储空间。
2、另一个不需要创建存储空间,不通过使用extern关键字声明变量名称来定义。
例如,在extern int a中,变量a可以在单独的文件中定义。
除非有extern关键字,否则是变量的定义。
示例:
扩展输入I; //声明,不是定义
int i; //也是宣言、定义
如果一个源文件需要引用在另一个源文件中定义的变量,则只需在引用的文件中将extern关键字声明添加到变量中。
变量定义和声明之间的区别:
变量定义:用于为变量分配存储空间,并为变量指定初始值。 程序具有变量,并且只有一个定义
变量声明:用于向程序显示变量的类型和名称
定义也是宣言。 定义变量时,声明了类型和名称
extern声明不是定义。 请勿使用extern关键字声明和定义变量名称。
[注意]
变量必须在使用前定义或声明。
在一个程序中,变量只能定义一次,但可以声明多次。
定义存储空间分配并声明不分配。
4.C语言的左值(Lvalues )和右值(Rvalues ) )。
c有两种公式。
左侧(lvalue ) :
指向内存位置的表达式称为lvalue表达式。
左侧的值可以显示在赋值编号的左侧或右侧。
右侧(值) :
术语右侧(rvalue )是指存储在内存中的特定地址的值。
右边的值是不能赋值的表达式。 也就是说,右边的值可以显示在赋值编号的右侧,但不能显示在赋值编号的左侧。
左边的值必须是变量
右值可以是变量、常量或表达式
总结:
如果需要保存数据,则需要lvalues。
如果需要读取数据,则需要rvalues。
lvalues和rvalues角色的相互转换:
1、根据公式的情况,lvalues在需要rvalues的地方自动转换为rvalues。 例如:
p>int n;int m;
m = n+2; // 这个表达式里 n 是 rvalues
2、 rvalues 永远不能转换为 lvalues
5.变量的内存寻址(与系统有关)
(1)内存寻址由大到小,优先分配内存地址比较大的字节给变量,所以说变量越先定义,内存地址就越大。 如下面代码,先定义变量 a,再定义变量 b,打印出 a 的地址是 0x7fff5fbff828,b 的值是 0x7fff5fbff824。a 的地址比 b 的地址大 4 字节。
(2)变量地址的获取方式:&变量名。
(3)输出地址的方式:%p。
#include int main()
{
int a;
int b;
printf("a的地址是%pnb的地址是%pn",&a,&b);
return 0;
}
(4)一个变量一定要先初始化才可以使用,因为 c 语言中默认一个没有初始化的变量值是一个不可知的很大值。如下面所示,a 没有初始化,打印出 a 的值是 1606422582。
#include int main()
{
int a;
printf("a的值是%dn",a);
return 0;
}
二:C语言中的常量
1.常量的定义
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量
常量就像是常规的变量,只不过常量的值在定义后不能进行修改
2.整数常量
整数常量可以是十进制、八进制或十六进制的常量
前缀指定基数:0x 或 0X表示十六进制,0 表示八进制
不带前缀则默认表示十进制
整数常量也可以带一个后缀,后缀是 U 和 L 的组合:
U 表示无符号整数(unsigned);
L 表示长整数(long);
后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
整数常量的实例:
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八进制的数字 */
032kddgb /* 非法的:不能重复后缀 */
各种类型的整数常量的实例:
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
3.浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成
您可以使用小数形式或者指数形式来表示浮点常量
当使用小数形式表示时:必须包含整数部分、小数部分,或同时包含两者
当使用指数形式表示时: 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E引入的。
浮点常量的实例:
3.14159 /* 合法的 */
314159E-5L /* 合法的 */
510E /* 非法的:不完整的指数 */
210f /* 非法的:没有小数或指数 */
.e55 /* 非法的:缺少整数或分数 */
4.字符常量
字符常量是括在单引号中
例如,'x' 可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 't'),或一个通用的字符(例如 'u02C0')。
在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(n)或制表符(t)等。
转义序列码:
转义序列
含义
\
字符
'
' 字符
"
" 字符
?
? 字符
a
警报铃声
b
退格键
f
换页符
n
换行符
r
回车
t
水平制表符
v
垂直制表符
ooo
一到三位的八进制数
xhh . . .
一个或多个数字的十六进制数
反斜杠() 开头是叫转义序列(Escape Sequence)。
ooo是对用三位八进制数转义表示任意字符的形象化描述。
比如 char ch = '101'; 等价于 char ch = 0101; (以0开头的表示八进制)。
xhh里面是 x 是固定的,表示十六进制(hexadecimal),h 也表示十六进制。
举例,char ch = 'x41'; 就是用十六进制来表示,它与前面的 101 是等价的。
可用如下代码证明它们等价:
#include int main(){
printf("%c,%c,%c,%c", 0101, '101', 'x41', 'A');
return 0;
}
5.字符串常量
字符串字面值或常量是括在双引号 "" 中的。
一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用空格做分隔符,把一个很长的字符串常量进行分行。
举例:
下面这三种形式所显示的字符串是相同的
"hello, dear"
"hello,
dear"
"hello, " "d" "ear"
6.定义常量
1.定义常量的方式
使用#define 预处理器
使用 const 关键字
2.#define 预处理器
定义常量的形式:
#define identifier value
实例:
#include #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;
}
运行结果:
value of area : 50
3.const 关键字
使用 const 前缀声明指定类型的常量:
const type variable = value;
实例:
#include 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;
}
运行结果:
value of area : 50
4.const和define 的区别
const定义的是变量不是常量
只是这个变量的值不允许改变是常变量!带有类型
编译运行的时候起作用存在类型检查
并不是去定义一个常量
而是去改变一个变量的存储类,把该变量所占的内存变为只读
define 定义的是不带类型的常数
只进行简单的字符替换
在预编译的时候起作用
不存在类型检查
它不能定义常量
但宏定义可以实现在字面意义上和其它定义常量相同的功能,本质的区别就在于 #define 不为宏名分配内存
(1) 编译器处理方式不同
#define 宏是在预处理阶段展开。
const 常量是编译运行阶段使用
(2) 类型和安全检查不同
#define 宏没有类型,不做任何类型检查,仅仅是展开
const 常量有具体的类型,在编译阶段会执行类型检查
(3) 存储方式不同
#define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存
(宏定义不分配内存,变量定义分配内存)
const常量会在内存中分配
(可以是堆中也可以是栈中)
(4) const 可以节省空间,避免不必要的内存分配
举例:
#define NUM 3.14159 //常量宏
const doulbe Num = 3.14159; //此时并未将Pi放入ROM中 ......
double i = Num; //此时为Pi分配内存,以后不再分配!
double I= NUM; //编译期间进行宏替换,分配内存
double j = Num; //没有内存分配
double J = NUM; //再进行宏替换,又一次分配内存!
const 定义常量从汇编的角度来看,只是给出了对应的内存地址
#define 一样给出的是立即数
const 定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区)
#define 定义的常量在内存中有若干个拷贝
(5) 提高了效率
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
(6) 宏替换只作替换,不做计算,不做表达式求解
宏预编译时就替换了,程序运行时,并不分配内存。