前言
本系列将记录学习《C Primer Plus》这本书中的一些心得笔记,欢迎大家相互交流,一起进步,本文是作者首次编写希望大家多多支持,哪里有不好的地方也希望各位看官多多指出。
相关概念
常量:一些数据类型在程序使用之前预先设定好,在整个程序运行过程中没有变化,称为常量。
变量:一些数据类型在程序运行期间可能会被改变或被赋值,称为变量。
位:最小的存储单元是位(bit),可以储存0或1,位是计算机内存的基本构建块。
字节:Byte是计算机常用的存储单位,几乎所有的机器,一个字节均为8位。
字:Word是计算机给定的自然存储单位。计算机的字长越大,数据转移越快,允许的内存访问更多。
数据类型
整数
计算机以二进制数字储存整数,例如,整数7以二进制写是111。在8位字节中储存该数字,如图所示。
浮点数
整数后加上小数点,该值就成为了一个浮点值。比如7是整数,7.00是浮点数。浮点数的储存方式和整数类型不同,计算机把浮点数分成小数部分和指数部分来表示,分开储存这两部分。
基本数据类型
int类型
int 类型是有符号整型,int类型的值必须是整数。
声明int变量
int erns;//声明一个int类型变量,取名为erns;
int hogs,cows,goats;//同时声明多个同类型变量
int hogs = 21;//声明一个int变量hogs,同时赋值为21
int dogs,cats = 94;
这里猜想一下是dogs为94呢?还是cats为94?结果是cats为94,最后一条语句只初始化cats,dogs并未初始化,所以为保证良好的编程习惯,最好一条一句完成一件事。
声明为变量创建和标记存储空间,并未其指定初始值。
其他整型变量
C语言提供3个附属关键字修饰基本整数类型:short、long、和unsigned。
short int类型:占用的存储空间不多于int,常用于较小数值以节省空间。
long 类型:占用的存储空间不少于int。
unsigned和signed用于区分是否需要负值。例如int类型可表示的取值范围位:-32768~32767而unsigned int 表示0~65535。
如果要把一个较小的常量作为long类型对待,则可在值的末尾加上l或L后缀,比如:3L。
目前常见的设置是,long long占64位,long占32位,short占16位,int占16或32位。
整数溢出
#include<stdio.h>
int main(void)
{
int i = 214483647;
unsigned int j = 4294967295;
printf("%d,%d,%d\n",i,i+1,i+2);
printf("%u,%u,%u\n",j,j+1,j+2);
}
会得到的结果是
2147483647 -2147483648 -2147483647
4294967295 0 1
有符号类型和无符号类型溢出可以理解为在其范围内循环。
char 类型
char类型用于储存字符(字母或标点符号)。C语言把1字节定义位char类型占用的位(bit)数。
声明char类型
char abc;//声明一个char类型的变量,名位abc,声明方式均相同。
char def,hij;
abc = 'A';//用单引号括起来的单个字符被称为字符常量。如果缺少单引号,则被认为是变量
def = A;//这是一种错误的表达方式。
在ASCII码中,A与65相对应,所以,字符是以数值形式储存的,所以也可以用数字代码值来赋值。
char abc = 65;//等效于char abc = 'A';
但是不建议使用这种方式进行编程,因子这样的前提是可以使用ASCII码,如不可以使用,则出现问题。
浮点数类型
浮点数类型有float、double和long double类型。浮点数表示类似于科学计数法。
指数计数法是计算机中的写法,e后边的数字表示10的指数。
C标准规定,float类型必须至少表示6位有效数字,取值范围至少是10^(-37) 至10^(37)。
C 语言提供另一种浮点类型是double(双精度)。double和float类型的最小取值范围相同,但是double可以表示10位有效数字,所以double所占字节长度相对长一些。
浮点型变量声明
float abc,def;
double xyz;
float abc = 1.11e-32;
打印数据类型
C语言中可以使用printf()函数打印数据类型的值。%d指明在这一行中打印整数的位置,%d称为转换说明,指定了printf()使用什么格式来显示一个值。
int a = 10;//声明一个int类型变量并初始化位10
printf("This number is:%d",a);//会显示This number is:10
char b = 'A';
printf("The code for %c is %d\n",b,b);//The code for A is 65
float c = 3.145;
printf("c = %f",c);//c = 3.145
printf("c = %.2f",c);//c = 3.14 只保留小数点后两位有效数字
printf("%f can be written %e\n",c,c);//e表示指数写法
在使用printf()函数时,传递给函数的信息被称为参数,转换字符的数量要与后面的参数一一对应。
printf("%d dogs ate %d chicks",dogs,chicks);//要一一对应。,也要保证数据类型相对应,用%d来表示浮点数是不对的。
printf("%d dogs ate %d chicks",dogs);//这是不正确的。
刷新输出
printf()何时把内容发送到屏幕上?刚开始printf()将输出发送到缓冲区(buffer)的中间存储区域,然后缓冲区的内容不断被发送到屏幕上。
C规定:当缓冲区满、遇到换行字符(\n)或需要输入的时候(调用scanf())时将缓冲区把数据发送到屏幕。
#include<stdio.h>
int main(void)
{
int a;
printf("hello world\n");//遇到换行符会刷新缓冲区,屏幕正常输出。
scanf("%d",&a);//输入时刷新缓冲区,屏幕正常输出。
return 0;//返回时刷新缓冲区,屏幕正常输出。
};
何时不会刷新缓冲区,即没有输出呢?
#include<stdio.h>
int main(void)
{
printf("hello world");//没有换行符
while(1);//程序进入死循环,没有输入也没有返回值,此时屏幕不会打印helloworld
}
更新于2022-12-18 23:11。