变量
来源:互联网 发布:mac .m2文件夹 看不见 编辑:程序博客网 时间:2024/05/10 12:53
变量
变量故名思议就是变化的值,生活中无处不在的变量,例如股市的上升下降,人民币升值贬值,游戏中人物的生命值等等。
开发人员通常使用变量来存储计算机的数据,通过操作变量就可以直接操作内存中的数据。
命名规范
变量的名字必须是一个合法的标识符即可,但是为了增加程序的可读性以及便于后期的维护,还需要遵守以下规范
变量可以由字母(大小写)+数字+下划线组成,建议命名知意,例如age,count,max_value等等
变量不能以数字开头,不能是C语言的关键字(例如void ,struct ,reigster,int等等)
变量名区分大小写,因此name和NAME是完全不同的变量
编译器的差别:VC的变量名、函数名可以支持中文,而GCC编译器是不支持中文的,不过不建议使用中文的变量名或者函数名。
对于老版本的编译器(GCC)如果没有开启C++11支持或者VC2010之前的版本,变量必须在函数调用之前定义。
/* 变量的命名案例 @author tony ittimeline@163.com @date 2017/10/31 17:18 @website www.ittimeline.net*/void varriable_named() { /*合法的变量标识符*/ int num; const int age; int _num; int emp_name; // linux系统命名风格 int EMP_NAME; //Windows系统命名风格}
声明
C语言要求在使用变量前,必须先声明,并完成初始化赋值后,再使用变量。
变量的声明非常简单,程序案例如下所示,只需要指定变量的数据类型和变量名称即可。
数据类型可以是C语言支持的数据类型,例如后期学习的基本数据类型,数组,结构体等等
变量名遵守命名规范即可
#include <stdio.h>/* 变量的声明 @author tony ittimeline.net @date 2017/11/11 15:03 @website www.ittimeline.net*/void varriable_declare() { int one, two, three; //声明3个整数变量,注册到系统创建的变量表中 //printf("one=%d\ttwo=%d\tthree=%d\n",one,two,three); //编译错误,变量必须正确的初始化后才能使用}
如果需要声明多个变量,它们之间需要使用逗号(,)隔开,然后以分号(;)结尾。
声明变量:指定变量的数据类型、名字以及初始化赋值的意义
通过声明变量,编译器可以建立变量符号表,维护变量的名字、类型信息,这样如果使用了未声明的变量,则直接在编译期间发生错误
指定变量的类型可以指示系统分配多少内存空间,同时指示系统如何存储空间中的值,明确了该值的取值范围(例如short的表示范围为-32768-32767之间),以及不同数据类型可以执行不同的操作,例如整数可以求余数(%)。
C语言的printf函数通过传递字符串参数 “%p”来实现查看变量的内存地址,程序案例如下所示。
#include <stdio.h>/* 通过printf函数查看变量的内存地址 @author tony ittimeline@163.com @date 2017/10/31 16:07 @website www.ittimeline.net*/void varriable_address() { int num = 10; printf("整数变量num的地址为%p\n",&num);//查看变量num的内存地址}
初始化
变量为何一定要初始化?
在VisualStudio2015中,变量如果不完成初始化赋值的化会被随机分配一个垃圾值。如果使用这个垃圾值会造成程序逻辑错误。
在VisualStudio2017中,变量声明后应该立即完成初始化,否则会发生编译错误。
一个良好的使用变量的方式就是声明后立刻赋值 例如 int age =28;
赋值
变量的赋值使用=来实现的,它的含义就是把一个字面量值(例如10,3.14等等)赋值给已经声明过了的变量。
变量都是存储在内存中,操作变量实际上就是操作内存。
C语言只能操作内存,无法操作寄存器
汇编语言既能操作内存,又可以操作寄存器
#include <stdio.h>/* 赋值的特点 1 C语言赋值的对象必须是声明的变量,汇编语言可以是寄存器 2 变量都是存储在内存中,操作变量就是操作内存 @author tony ittimeline@163.com @date 2017/10/31 16:42 @website www.ittimeline.net*/void varriable_assignment() { int init = 3; //初始化 第一次赋值操作,只能给变量进行赋值操作,变量处于内存中// init + 1 = 4; //init+1处于寄存器中,C语言没有操作权限,汇编语言具有操权限。 int height = 628; printf("height变量的内存地址为%p\n",&height); height = init+ 1; height = init+ 2;}
变量赋值的原理
内存中只能存储变量,而变量的赋值(赋值也是一种运算,后期学习运算符时会深入了解)以及各种表达式的运算都是由CPU的寄存器完成的。
接下来使用一段汇编语言的代码实现变量的赋值以及变量的加法运算,程序案例如下所示。
#include <stdio.h>/* 变量赋值的原理 @author tony ittimeline@163.com @date 2017/11/12 15:48 @website www.ittimeline.net*/void varriable_assignment_with_asm() { int num; printf("num的变量地址是%p\n", &num); num = 10; //赋值操作是在CPU寄存器内部完成的 //printf("获取常量10的地址 %p",&10); //10这个常量在被操作的时候,其实是存储在寄存器中 由于C语言不具备操作寄存器的权限,因此取地址无法进行操作 /*使用汇编语言实现寄存器的赋值*/ __asm { mov eax, 20 //将代码区符号表当中的常量移植到寄存器eax中 mov num, eax //在寄存器中完成赋值操作,用于将寄存器当中的常量赋值给内存当中的常量 } printf("寄存器赋值完成以后整数变量num的值为%d\n", num); /*使用汇编语言实现变量的加法运算*/ __asm { mov eax, num //将内存当中变量num的值读取到CPU的寄存器eax中 add eax, 5//将寄存器当中读取的数据从代码区符号表当中移植移植到寄存器的数据进行加法操作 mov num, eax//将寄存器中进行加法操作之后的最终数据赋值给内存中的变量num } printf("寄存器完成变量相加后整数变量num的值为%d\n", num); system("pause");}
应用案例
基于中间变量实现两个变量交换数据的实现
该算法的特点是增加了空间,节省了计算时间
#include <stdio.h>/* 变量的交换 基于中间变量实现交换 增加了空间,节省了计算时间 @author tony ittimeline@163.com @date 2017/11/12 19:50 @website www.ittimeline.net*/void varriable_swap_with_tmp(int left,int right) { printf("varriable swap with tmp \n"); printf(" swap before left =%d\tright=%d\n",left,right); int tmp = left; left = right; right = tmp; printf(" swap after left =%d\tright=%d\n", left, right); system("pause");}
基于算术运算实现两个变量的数据交换实现
该算法的特点是增加了计算时间,节省了空间
使用算术运算时还需要注意数据溢出的问题
#include <stdio.h>/* 使用算术运算实现变量的交换(注意数据溢出) 节约了空间,浪费时间 @author tony ittimeline@163.com @date 2017/11/12 19:55 @website www.ittimeline.net*/void varriable_swap_with_alg(int left,int right) { printf("varriable swap with alg \n"); printf(" swap before left =%d\tright=%d\n", left, right); left = left + right; right = left - right; left = left - right; printf(" swap after left =%d\tright=%d\n", left, right); system("pause");}
变量交换的最佳实现
通过亦或运算符,既不需要中间变量实现数据交换,又不需要考虑数据溢出的问题
#include <stdio.h>/* 使用亦或实现变量的交换 @author tony ittimeline@163.com @date 2017/11/12 19:55 @website www.ittimeline.net*/void varriable_swap_with_xor(int left,int right) { printf("varriable swap with xor \n"); printf(" swap before left =%d\tright=%d\n", left, right); left = left^right; right = left^right; left = left^right; printf(" swap after left =%d\tright=%d\n", left, right); system("pause");}