上一篇C语言从零开始(三)-基本字符集讲了基本语法的第一部分,今天我们来说说C语言中的数据类型和赋值。
一,概述
C 语言包含的数据类型如下图所示:
C语言数据类型这张图大家肯定在很多教材中都见过,它包含了C语言中涉及的全部数据类型
1. 数据类型的意义
先简单说一下数据类型的作用。在C语言中,程序操作的最基本的元素叫做变量。编程的实质就是把变量中保存的内容进行处理,最终返回一个处理后的结果。
而计算机用于保存不同变量的内部结构是不同的,最直接的不同就是在内存中为这个变量申请的空间大小不同。因此,我们在定义变量的时候应该告诉计算机这是一个什么类型的变量,这就是数据类型的意义。
一定有人会问,计算机为啥不给每个变量都分配一个足够大的空间,这样大家就可以使用同一种数据类型了,不用再做区分。这是因为最早的计算机内存是非常有限的,如果你只需要保存很小的数据却用了非常大的空间,那就造成了极大的浪费。如今内存越来越便宜,空间越来越大了,但节省空间开销依然是软件开发的一个重要原则。
话说有些脚本语言比如JavaScript中是淡化数据类型的,所有的变量都使用统一的数据类型var。有兴趣的同学可以了解一下。
2. 赋值
定义了变量之后,要给变量赋值。没有被赋值的变量是不能被使用的,这是C语言的一个重要规定。请看这段代码:
int a;
a = 5;
以上这两行完成了两个动作,第一行定义了一个数据类型为“int”,变量名为“a”的变量,第二行给变量"a"赋值5。
需要注意的是"int"和“a”中间需要一个空格,每行结束后需要一个“;”。
另外,第二行中“=”两边各有一个空格,这一点不是C语言要求的,只不过是业内约定俗成的规矩,方便阅读。这种规矩还有很多,后面会专门说到,让你的代码风格更地道。
如果觉得两行代码太麻烦,还可以这样写:
int a = 5;
这一行和前面的两行效果完全一样,采用哪种写法都可以。
此时如果我们想看看a中的值是不是5可以执行下面这行代码:
printf("%d", a);
现在你知道如何把这几行代码在Code::Blocks中运行吗?如果不会请阅读之前的文章。
BTW:最后要说的是,定义了变量一定要尽快赋一个值,我们叫初值。因为定义变量实际上是在内存中开辟了一块新空间,但空间里也许有之前留下的东西(数据)。所以,如果你不用初值把这块空间覆盖掉,很容易在后面出现莫名其妙的问题。
二,各种数据类型介绍
1.整型
整型分为short、int、long,最大的特点就是在不同平台或编译器下所分配的内存空间不同。我们统一按32bit Windows操作系统进行讲解。
整型主要任务是保存自然数的,只不过保存数字的范围不同。
1.1 短整型(short)
一般大小2Bytes(16bits),定义方法
short a = 1;
1.2 整型(int)
这是最常用的整型,一般大小4Bytes(32bits),定义方法:
int a = 6;
1.3 长整型(long)
一般大小8Bytes(64bits),定义方法:
long a = 10;
虽然在不同平台这三种变量表示的大小不同,但有一个基本原则:
short类型的大小 <= int类型的大小 <= long类型的大小
“<=” 这个符号是C语言中“小于或等于”的意思,后面会介绍
2. 浮点型
浮点型包括单精度型和双精度型。
2.1 单精度型(float)
浮点型,又称实型,也称单精度。一般占4Bytes(32bits)
float a = 4.5f;
这里4.5后面有个“f”,先记着写法,后面我们会具体讲解。
2.2 双精度型(double)
一般占8Bytes(64bits)
double a = 4.5;
打印浮点型数值的方法略有不同,如下:
printf("%f", a);
注意,只是“%f”略有不同。
3. 字符类型
3.1 单个字符类型
在各种不同系统中,字符类型都占1Bytes(8bits)。定义如下:
char c = 'a';
也可以用字符对应的ASCII码赋值,如下:
char c = 97;
打印字符类型的方法:
printf("%c", c);
这个类型需要多说几句。计算机其实是不能保存字符的,因此,字符类型的内部其实保存的也是数字。那么怎么知道哪个数字代表什么字符呢?有一张世界通用的“密码表”叫做ASCII码,它保存着大部分常用字符和数字的对应关系。
就像《潜伏》中余则成收到广播中念的数字,怎么能知道它们代表什么意思呢?需要找一本密码本查一下,于是数字变成了汉字。一样的道理。
潜伏里接收电台里密码剧照3.2 字符串
C语言中使用双引号" "表示一个字符串,比如:"ABCDEF"。这就是我们在打印"Hello World!"时为什么要使用双引号的原因。
在C++中,有个字符串的类型交string,于是我们可以这么写:
string str = "ABCDEF";
很遗憾的是,C语言中并没有string类型,我们只能用字符数组保存字符串。关于字符数组我们会在数组部分讲解。
3.3 练习
这里提出个简单的问题,下面代码输出结果是什么,看你能不能想明白。
void main()
{
char a = 'a';
char c;
c = a + 1;
printf("%c", c);
}
4 其他类型
前面讲的六种数据类型是C语言的基础数据类型。目前掌握就可以了,至于其他的结构体、数组之类的后面会专门讲到。
还有两个关键字signed和unsigned,是用来定义变量是否保存正负号的,也可以先不了解。
三,变量的命名规则
真正的软件开发中,变量命名是一个非常重要的内容。在团队开发、项目传承的过程中,代码的可读性起着重要的作用。因此要养成好的变量命名习惯。
1. 命名要能望文生义
要便于记忆和阅读。标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。C语言开发中有一个比较著名的命名规则叫“匈牙利命名法”,有兴趣可以学习一下。
无论什么样的命名规则,都有它的利弊所在,真正的项目中也会有具体的命名规则要求。重点是,每个人自己写的代码要自己有一个统一的规则,这样无论是别人还是自己都更容易读懂和维护。不要过一段时间连自己写的代码都看不懂了,这是最基本的要求。
其实大学计算机等级考试中,很多题目都是符合这条的,这给考生很多空子可钻。记得有个题目是这样的。
int a, b, sum;
a = 5;
b = 1;
sum = XXXXX(a, b);
printf("%d", sum);
请问屏幕打印出的数字是多少?
这道题主要考的是XXXX函数的问题,也许你根本没看懂这个函数是啥意思,但一看变量“sum”你就知道最终输出的肯定是一个和,所以答案是6。
2. 要用最短的命名表达最多的意思
虽然现在对命名长度的限制越来越小,但过长的命名还是影响代码的可读性。
3. 尽量不要出现数字
Value1,Value2 这样的变量还是少用为好
4. 不要靠大小写区分的相似的标识符
int a, A; // 绝对不允许
反正容易混淆的就尽量别用
好了,今天就先说到这里。下一篇我们开始讲常量与变量。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:C语言从零开始(三)-基本字符集
下一篇:C语言从零开始(五)-常量&变量
网友评论
#include <stdio.h>
int main(void)
{
double Number_1 =0.0;
double Number_2 =100;
printf(" input the number \n");
scanf("%f",&Number_1);
printf(" Number_1 is %.2f\n",Number_1);
printf(" Number_2 is %.2f\n",Number_2);
return 0;
}
问一下天花板大大,我最近在学习过程中出现点疑惑,寻思两天仍不能解决,主要是因为自学到了类型这一部分,每次涉及到double类型总要出错,输出为0.测试代码如上,我自己做的小测试代码,同样都是double类型的两个变量,一个需要运行后scanf()输入,一个直接赋值100,运行后,scanf()输入的也是100,输出结果后,问题来了,同为小数的浮点类型,一个输入100,一个赋值100,最后输出的时候,Number_1输出为0 ,直接赋值的Number_2能正常输出为100.00.随后我又反反复复在 %f 与 %lf 之间来回修改,发现针对double类型,在scan()必须为 %lf ;需要添加字母L,不然会导致最后结果为0.00.而在printf()里面,必须是%f,反而“不能”添加字母L,不然会导致最后输出错误,为何double类型在scanf里 是LF,而printf里是F呢,种子选手,希望能解释一下,是不是我的什么编译环境有毛病了,还是说两个scanf和printf里的% 格式说明符就是不一样,那还有别的类型也存在这种不统一的问题吗?算了,后面这个问题其实我自己编一段小代码一个一个测试就好了,自己动手,那天花板大大就帮忙解释I下第一个问题吧,就是;是不是我的什么编译环境有毛病了,还是说两个scanf和printf里的% 系列的格式说明符就是不一样