目录
————引入sizeof(操作符-也是关键字)(x64配置下)
一、C语言是什么
1.定义
首先,C语言是一门面向过程的计算机编程语言,它既具有高级语言的特点,又具有汇编语言的特点。在人与人的生活中,我们会使用,中文,英语,日语,手语等各种语言,这些都为了达成了对话,交流的目的,那么,人和机器怎么交流呢,那就需要计算机语言的帮助了。
2.历史
C语言的祖先是BCPL语言。
1963年,剑桥大学基于ALGOL60的规范推出了CPL语言
1967年,剑桥大学的 Martin Richards 对CPL语言进行了简化,于是产生了BCPL语言。
随后,1970年贝尔工作室Ken Thompson以BCPL语言,设计出了很简单且很接近硬件的B语言,并且用B语言写了第一个UNIX操作系统(肯 汤普森)
牛人与牛人总是相伴,同是贝尔实验室的D.M.Ritchie(丹尼斯·里奇)在B语言的基础上发明了C语言
这位大牛为了推广,在1977年发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言
1983年 肯 汤普森与丹尼斯·里奇获得图灵奖
为了使各家人,用的C语言统一起来,1990年,国际标准化组织ISO(International Organization for Standards)接受了89 ANSI C 为I SO C 的标准(ISO9899-1990)。
总的来说,C语言发展史:CPL——BCPL——B语言——C语言。
至今,一直到今天C语言还在广泛的使用在计算机排行榜上霸占前三名。
二、第一个C语言(Hello World!)
1.代码与运行
2.讲解
#include <stdio.h> //头文件
int main() //主函数
{
printf("Hello World!\n");//格式化输出函数
return 0;
}
头文件:在C语言当中,我们会运用到各种不同的函数,来达成输入、输出等目的,而这些 函数,就隶属于各自的头文件。就像这里用的printf函数,就隶属于<stdio.h>头文件中。
主函数main:主函数是程序的入口,不管定义多少函数(定义函数是以后的内容),第一个入口只能是main函数。其中int 为数据类型,表⽰ main 函数执⾏结束的时候返回⼀个整型类型的值。(与return 中的0相对应)
注:①main函数有且只有一个
②即使在一次项目中,有多个文件,但也只能有一个main函数。
printf:格式化输出函数printf(""); 它会将我双引号里的内容呈现在屏幕上。
return 0:程序结束后。正常退出。至于return后面是0还是什么,这也得放到后面在讲。
注:编写过程中,一句语句后面需要加分号
编写时所有符号必须用英文符号,eg:
三、C语言当中的字符和ASCll编码
1.ASCII
在平常,我们在电脑上敲出的“@、a、b”诸如此类都是字符;
那么在C语言中我们需要用单引号把它括起来表示为:‘a’,‘@’,‘b’等
计算机用二进制来储存所有数据,那么这些字符在计算机中又是怎么表示的呢
给每个字符编一个二进制序列,即编码;随后由美国国家标准学会(ANSI)出台了ASCII编码,C语言就遵循ASCII编码的方式
ps:这其实就相当于一个规定。我们也不需要整张表格背诵(表格在附录)
小编推荐大家记:
1.65 A;97 a;对应的大小写差值为32(按照英文字母顺序,每个大小写都可知)
2。字符 0 为48;(0-9即为48-52)
3.换行\n为 10;
4.0-31这32个字符是不可打印字符
2.打印字符(可以先看数据类型)
单字符用%c来指定格式
eg:
注意到虽然第二行中不是A,但是我输入其对应的ASCII码,加上%c就是用来指定为字符格式的。所以,它也会打印出A
3.转义字符
①定义:转变了原来字符意思的字符;
②各种转义字符
\?:在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
\':用于表示字符常量。
\":用于表示一个字符串内的双引号
\\:用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a:警报,这会让终端发出警报声或出现闪烁,或者两者同时发生。
\b:退格键,光标回退一个字符,但不删除字符。
\f:换页符,,光标移到下一页。在现代系统上,这已经反应不出来,行为改成类似于\v
\n:换行符
\r:回车符,光标移到同一行的开头。
\t:制表符,光标移到下一个水平制表位,通常是下一个8的倍数
\v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
以下两种较为特殊:可理解为字符的8进制或16进制表示形式
\ddd: d d d表示1-3个八进制的数字。如:\130 表示字符X
\xdd: d d表示2个十六进制数字。 如:\x30 表示字符0
\0:null字符,代表没有内容,\0就是\ddd这类转义字符的一种,用于字符串的结束标志,其ASCII码值为0(略)(以后会提到)
eg:\?:在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
int main()
{
printf("(are you ok??)\n");
//在过去一些编译器上,支持三字母
//eg:??) —— ]
//??( —— [
//如果不想被解释为三字母词问号,在问号前加上 \
printf("(are you ok\?\?)\n");
return 0;
}
\':用于表示字符常量。
int main()
{
printf("%c\n", 'a');
//printf("%c ",'''); 想打印单引号
//在C语言中有语法规定,两个单引号构成一个字符,那我们想打印单引号
//就需要使用 \
printf("%c\n",'\'');//用\来转义 '
return 0;
}
\":用于表示一个字符串内的双引号(同上)
\t:制表符,光标移到下一个水平制表位,通常是下一个8的倍数
\\:用于表示一个反斜杠,防止它被解释为一个转义序列符。
int main()
{
printf("abc\test\test\n");//本想打印abc\test\test,但这里却成了转义字符\t
printf("abc\\test\\test\n");//这里就需要\来修饰\让\就是其本身
return 0;
}
\a:警报,这会让终端发出警报声或出现闪烁,或者两者同时发生。
\b:退格键,光标回退一个字符,但不删除字符。
这里发现:在第二行打印到d时,光标回退了一个打印了ef 顶掉了d
\n:换行符
\r:回车符,光标移到同一行的开头。
这个可能得自己试
\v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
\ddd: d d d表示1-3个八进制的数字。如:\130 表示字符X
八进制数字转化为十进制,打印为其对应的ASCII码
\xdd: d d表示2个十六进制数字。 如:\x30 表示字符0
四、数据类型
那我们怎么在C语言当中来描述数据呢,比如说小数,整数等;那我们可以类比一下在日常生活中,我们自己已经默认,什么样的数字是整数,什么样的数字是小数;那在C语言当中,我们需要把一个数是什么样子告诉计算机,那这个样子就是数据类型;
C语言当中有各种数据类型,,本章节主要探讨内置数据类型、
1.内置类型
①字符型(ps:这里 [] 括着的可省略)
char ;
[signed] char(有符号--正/负号)---(对signed和unsigned可以先看下文特别说明)
unsigned char(无符号)
②整型
整型又分为
Ⅰ短整型
short [int]
[signed] short [int]
unsigned [int]
Ⅱ整型
int
[signed] int
unsigned int
Ⅲ长整型
long[int]
[signed] long [int]
unsigned long [int]
当然了,我们还有更长的整型
在C99中提供
long long [int]
[signed] long long [int]
unsigned long long [int]
ps:short 和 long 修饰的int 可省略
③浮点型(描述小数)
float 单精度浮点型
double 双精度浮点型
long double 更高精度的浮点型
④布尔类型(建议 )
C语言原来用0来表示假;非0表示真;
_Bool or bool ————使用必须包含头文件<stdbool.h>
其变量的取值是:true or false
其中已经定义好了true = 1;(真)
false = 0;(假)
eg:
这里用了if语句,判断中为真就执行语句,为假就不执行;
很显然,当我给布尔类型的flag定义了不同值时,真假也就变了;
当flag = true(即就是1),执行打印
当flag = flase(即就是0),不执行打印
2.每种数据类型的取值范围
limits.h 头文件查找整型类型的取值范围
float.h头文件里查找浮点型类型的取值范围
重点:
1.不同的类型它的区别是什么呢
①描述的类型不同(这个显而易见)
②在内存中占据空间不同
————我们要怎么知道每种类型,占用了多少的空间呢
————引入sizeof(操作符-也是关键字)(x64配置下)
sizeof后面可为类型,变量或表达式 其返回值单位为字节(附录 有单位换算)
注:C语言规定sizeof返回为无符号整型(unsigned),但并未规定返回什么类型
那就麻烦了啊,不同的系统返回值不同,代码的移植性就差了;
就在这时,C语言——该出手时就出手,它创造出了一个别名size_t,用来统一sizeof的返回值;
size_t 这种类型,用%zd来打印
1.用sizeof查看数据类型所占内存大小
eg:int main()
{
printf("%zd\n",sizeof(char));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
那有同学就奇怪了:为什么我的long 和int一样大呢;
因为C语言规定sizeof(int)<=sizeof(long);有些编译器可能是>
2.sizeof后面为变量/表达式时
①sizeof后表达式括号可省略;
②sizeof后表达式不计算,根据其数据类型得出大小
对比可发现:3.5+3.5 结果尽管是 7 ,但内存大小仍旧为8;可知sizeof后表达式不参与计算
int main()
{
int a = 5;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3));
printf("%zd\n", sizeof(3 + 3.5));
printf("%zd\n", sizeof(3.5 + 3.5));
return 0;
}
————signed和unsigned
生活中有很多东西是绝对不会有负数的:年龄,身高......这时,就需要unsigned出手
signed | unsigned | |
相同 | 关键字,用于修饰整型和字符型 | |
不同 | 表示一个类型带有正负号 | 表示一个类型无正负号,只能表示0和正整数 |
对于上文中signed int 中signed可省 因为对于 int 来说默认带有正负号; unsigned 来设置int无符号
可对于char类型来说,也可以设置signed和unsigned类型;
那有什么好处呢
对于unsigned类型来说,同样长度的内存能够表示的最大值
signed中的第一位为正负数的表示0/1,而unsigned类型不需要,所以
16位的 signed short int 的取值范围是:-32768~32767,最⼤是32767;
⽽unsigned short int 的取值范围是:0~65535,最⼤值增⼤到了65,535。增大了一倍
在limits.h中定义
五、C语言的书写风格
1.遵循规则
①一个说明或一个语句占用一行;(千万不要把所有的语句挤在一起)
②用{}括起来的结构,通常是程序的一个层次;在使用时,尽量让花括号各占一行;上下对齐更好;eg:
这里用到了if语句,我先用白话文来跟大家讲解一下;
先定义了一个变量 i,初始化值为1;
if(如果)i=1,我就输出下面两个printf里的字符串;
这里的举例只是为了让大家知道规范性;花括号上下对齐的好处大家慢慢可以感受到
③缩进格式
非常明显,有缩进会很好的帮助大家阅读代码,避免很多错误,因为没有缩进可能导致的错误很多,以后可能时不时的拿出来唠一唠
编译器通常在按下回车(enter)时自动缩进;若想自己调整,可以按tab键
这是书上的一个例子,我把它改的易于理解;这段代码是为了计算出 a和b的和;
两段代码对比,以见得风格好的重要性。
附录
1.ASCII(美国信息交换标准代码)表格
有些表格中有十六进制等的换算可以自个上网搜搜。
2.byte:字节 bit:比特
1Byte = 8 bit
1KB = 1024Byte
1MB = 1024 KB
1GB = 1024MB
1TB = 1024GB
六.总结
本次内容主要在字符、ASCII码以及数据类型上;这都是我们后面会反复用的东西。
那么,我们知道C语言由很多的语句组成,拿下一篇我们就着重讲讲语句,还有很多的前置知识点。