数据类型
数据类型,看它名字我们就可以知道它的大概意思,没错,就是数据的类型。
比如10,它是一个整数,所以我们称它为整型,在c语言中用int表示
再入10.5,它是一个小数,我们在c语言中称它为浮点型,用float及double表示。
还有比如一个字母a,它是一个字符,我们在c语言中称它为字符型。可以用char表示。
.....等等还有其他的一些,但我们在这里能大概了解数据类型的意思就可以了
我先列举一下常用的数据类型
char 字符数据类型 (例如a,b,c,d,A,*,/等这样的形式的)
short 短整型 (比下面的整形表示的数范围较小的整形,范围-2^15~2^15-1)
int 整形 (表示更长的整形 ,范围-2^31~2^31-1)
long int长整型 (比int更长一些)
long long int 更长的整形 (比long int 更长,具体范围我也不清楚了哈)
flaot 单精度浮点型
double 双精度浮点型(双精度浮点数所能表示的小数点比单精度浮点型更多)
既然他们所表示的范围或类型不同,那它们应该所占的内存空间大小也应该不同吧?
c语言提供了一个函数sizeof,该函数的定义是用来计算对象所占的字节个数。
既然我们有了这个便利的函数,那我们来验证吧。
printf("char: %dn", sizeof(char)); printf("short: %dn", sizeof(short)); printf("int: %dn", sizeof(int)); printf("long int: %dn", sizeof(long int)); printf("long long int: %dn", sizeof(long long int)); printf("float: %dn", sizeof(float)); printf("double: %dn", sizeof(double));
输出结果如下:
我们发现,字符型数据占的字节最小是1,最大的double和long long int类型,占的是8个字节
这个时候细心的同学可能发现,long int范围明明比int大,为什么和int占的字节数一样的?
因为c语言标准规定:
只要sizeof(int)>=sizeof(long)即可,并没有严格规定long int 必须是几个字节,但规定了long long int是8个字节
刚才那个结果实在32位平台下测试的,我们在64位平台上测试,得到的是同样的结果:
既然刚才我们提到了字节,那就不得不说明一下计算机中的单位了
计算机中最小的单位是bit,中文名字比特位。
比它大一级的就是byte,即我们所说的字节。1byte=8bits。
再往后是KB。1KB=1024byte。
再往后是MB。1MB=1024KB。
后面的下一级与上一级都是1024的关系
GB,TB,PB..........
变量
变量可以分为全局变量和局部变量。
定义变量:类型名(我们以上讲的数据类型)+变量名(可以自己定义,但是不能与关键字同名,后面会说关键字);
例如,我想定义一个整数1,它的名字是a,我们便可以写成如下形式。
int a=1;(int数据类型名字,a是自己起的名字)
同样的,我们想定义一个小数1.5,叫它为b吧,可以写成下面的样式。
float b=1.5;
double b=1.5;
因为float,double都是表示浮点型,所以都可以用来顶定义。
先来简单说一下局部变量。抽象点来说,就是定义在大括号内部的变量。
例如:
int main() { int a = 1; printf("%d",a); }
这样我们就成功定义了一个局部变量。屏幕输出的结果是1.
再说一下全局变量,就是定义在所有大括号外部的一个变量。
例如
int a = 2; int main() { printf("%d",a); }
这样就成功定义了一个全局变量,屏幕上输出的结果为2.
但是这个时候存在一个问题,如果全局变量和局部变量同名,程序会执行全局变量还是局部变量呢?
我们可以看以下内容
#includeint a = 2; int main() { int a = 1; printf("%d", a); }
屏幕上输出结果是1.
我们在此可以得出结论:局部变量的名字和全局变量的名字冲突的情况下,局部变量优先执行
变量的使用
问题:用户输入两个数,求出这两个数之和
我们可以想到,既然输入两个数,那么应该可以定义存放这两个数的变量,分别为num1和num2吧。定义好了,怎么让用户输入呢,c语言提供了一个scanf函数,可以获取用户输入的数据,并存放到相应的变量中。
格式如下:scanf("%d%d",&num1,&num2);
双引号里面的是数据类型的一种表示,%d表示整型,%f表示单精度浮点型,%lf表示双精度浮点型等等,后面的是对相应变量的输入。&num1是把用户输入的值给存到num1中,num2亦是如此。
输入好之后,既然要求他们之和,应该执行相加的 *** 作吧,就是num1+num2;
既然加起来了,那我们该放到哪里呢,这是我们需要在定义一个变量比如sum吧。
int sum;
sum=num1+num2;
最后将其输出出来就可以了。
完整代码如下:
#includeint main() { int num1; int num2; int sum; scanf("%d%d", &num1, &num2); sum = num1 + num2; printf("%d", sum); return 0; }
关于变量的作用域和生命周期
作用域:简单来说,就是一个变量哪里可以使用,那里就是他的作用域
文字抽象,我们喜欢用例子来帮助大家理解
先来说局部变量的作用域:
int main() { { int a=100; printf("%d:,a); } printf("%dn",a);//这里出错 }
我们发现代码出错了,但调试的时候发现,第一个printf可以正常输出,第二个printf却显示变量未定义,这个时候可能我们就有点理解了,a的作用域仅仅局限于它临近的那一个大括号里面,即第三行和第六行之间是它的作用域。
全局变量的作用域
全局变量的作用域适用于整个工程的,整个工程!可能没什么概念,就是你新建的那个项目里面无论创多少个源文件,那个全局变量作用域都可以在所有文件里面使用。
我们先来看例子:
我先创好了两个文件
我在源1.cpp里面创建了一个全局变量a。
既然全局变量的作用域用于整个工程,那我在源2来输出这个a
出错了?注意看下面那个未声明,怎么回事啊,不是说好的作用域是整个工程啊,为什么啊这是?
原来,我们需要一个函数,这个函数是来调用声明外部符号的,extern。
也就是我们想在别的文件用这个全局变量,我们必须使用extern这个函数
具体怎么用呢,看下图
这个时候他成功运行了!
注意:extern 引用了全局变量之后不能再赋值
只能 extern int a;
而不能extern int a =4;
生命周期
理解了作用域这个也没什么可以说的,都能理解了
变量的生命周期是指变量的创建到变量的销毁之间的一个是时间段
局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期:整个程序的生命周期
常量
常量分为四种:
1.字面常量
2.const修饰的常变量
3.#define定义的标识符常量
4.枚举常量
1.字面常量
我们给a赋值是,比如10,3.14
一个字母a我们叫做字符常量
"abcd"字符串常量
上面那些直接写出来的都是字面常量
2.const修饰的[常变量]
const(常属性)是一个关键字。
有时候我们不想定义的变量被修改,可以用const
例如
int num=1; num=2; printf("%d",num);
最后输出结果是2,说明我们定义的变量被修改了
但是如果加上const
const int num = 1; num =2; printf("%d",num);
这个时候程序报错了
错误:不能给常量赋值,说明此时它已经被修饰成常属性的变量
那被const修饰的变量直接叫常量就行了,为什么叫所谓的常变量呢?
先说一个知识吧,就是在创建数组中,数组的大小就是括号里面的数不能是变量;
例如,创建一个数组:
int arr[5];//可以创建
但是如果
int n=5;
int arr[n];程序却报错了
但是我们这个时候如果用const修饰呢?按理来说,修饰之后就不会变了,相当于一个常属性了。但是编译器此时还是报相同的错误
这说明它的本质还是变量,但具有常量的属性
便称他为常变量。
3.#define 定义的标识符[常量]
#define M 100[M是标识符的名字]
int arr[M]={0};//可以执行
说明M就是一个常量
4.枚举常量
枚举,说白了就是一一列举,把所有可能情况全部列出来.
例如,性别:男或女,三原色:红色,绿色,蓝色
星期:有周一,周二....一直到周日
这些可以一一列举的量,我们可以用枚举常量全部列出来
这时c语言提供了一个枚举关键字enum。
用法如下,还是用例子解决:
比如我们想列举性别
可以这样写:
enum Sex { male, female };
注意每个例子后面是逗号,最后一个例子后面不加符号
再如三原色:
enum Color { RED, GREEN, BLUE };
它们怎么表示常量的呢?
我们可以以下 *** 作:
printf("%d%d%d",RED,GREEN,BLUE);
输出结果为012.
同理,性别我们也做同样的 *** 作
printf("%d",male,female);
得到结果为01。
由此我们可知:枚举常量中第一个量是从0开始,向下每次递增加1的。
以上是关于数据类型及常量和变量的一些基础知识,如果有困惑,欢迎私信问我哦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)