C语言
为什么机器语言是二进制语言?
谁不喜欢0和1呢
技术上容易实现。
可靠性高
运算规则简单
与逻辑量相配
二进制能够转换成任何十进制整数
关于苏联时期的三进制计算机
网上的信息很杂很乱,包括挺喜欢b站一个视频主—差评君,也是没有讲清楚。
有说三进制复杂的,二进制三进制相比没有特别复杂(Wiki上说二进制三进制没有差多少》》》》肛精别肛,小心脱肛"The complexity of arithmetic circuitry for balanced ternary arithmetic is not much greater than it is for the binary system, and a given number requires only as many digit positions for its representation."——The art of Computer Programming. )
有说电路难实现的
有说得不到长官们的支持的
所以不管怎样反正是夭折了,至于三进制优点并不少
[https://en.wikipedia.org/wiki/Balanced_ternary#cite_note-Knuth-6]:
c程序的构成
代码由单词,符号,空白组成。
c语言的注释
//
/* xxxx*/
c语言必须有main函数
main函数是c语言程序的起始执行点,每一个c程序有且仅有一个main函数。
void main()
void是指main函数的返回值数据类型,void表示main函数仅仅完成某些功能,不用向调用者返回数值
main是函数名称可以是C语言系统提供的系统函数也可以是自定义函数
()括号里是传递给函数的的参数。
函数的定义和调用
函数定义就是程序员编写程序代码,去实现函数功能
函数调用就是调用已经编写好的函数、
函数被调用前,一定要让编译器知道函数的原型,这样的编译器才知道有哪些函数名,该函数需要什么类型的参数,返回什么样的类型的值。告诉编译器函数类型的动作成为函数声明。
#include
源代码最终是需要被编译器处理的。编译器编译的过程比较复杂,但一般需要经历好几步,第一步就是预处。所谓的预处理就是在编译前先进行一些预处理。
#include的作用是告诉编译器,在编译前要做一些预先处理:将后面的<>中的文件内容包含到当前文件中,所谓的包含,就是将<>中列出的文件的内容复制到当前文件里。
std是标准(standard)的缩写,io是input和output的缩写,联合起来就是“标准输入输出”的意思。
.h是C语言头文件扩展名,所谓的头文件,就是该文件都是些函数的声明,变量的声明等内容
.c文件是C语言实现文件,是真正做事情的文件。
进制
2进制8进制16进制是计算机中常用的进制形式
二级制:二进制是用0和1两个数码来表示的数。它的进制是逢二进一
八进制:八进制使用0—7共八个数码来表示的数。它的进制是逢八进一
十进制:地球人常识
十六进制:十六进制是由0-9和A—f这十六个字符表示。它的进制是逢十六进一2换
2进制到8进制:10100100-> (10100 100)->(244)8 可以看出2进制和8进制转换是把二进制从右三位划分一组
2进制到16进制:10100100->(1010 0100)->(A4)16,可以看出2进制和16进制转换是把二进制从右四位划分为一组
计算机中内存的最小单位是以位为最小存储单位的
数据类型
直接常量和符号常量
直接常量就是一般所说的常数,但一般开发中应该避免使用直接常量
符号常量也需要先定义后使用,由于符号常量是简单的代替动作,所以其值在程序代码中不能再进行修改的
符号常量虽然在程序开发过程中没有强制规定使用直接常量还是使用符号常量,但是是哦弄个符号常量比使用直接常量有明显的优点。
:
通过有意义的单词符号,可以指明该常量的意思,使开发者在阅读代码时候减少困惑
需要修改常量的时候,只需要修改一次就可以实现批量修改,效率高且准确
但符号常量也有自己的缺点,不能进行类型检查等。好像直接常量也有
变量声明
在声明变量的时候,需要给这个变量一个名字,有了名字以后才能以后使用这个变量。
变量声明的意义
建立变量符号表:通过变量声明,编译器可以建立变量表这样程序使用了多少变量,变量的类型是什么,编译器就很清楚了。
变量的数据类型表明了系统为其分配了多少内存空间
变量的数据类型只是了系统如何解释内存空间的值
变量的数据类型确定了该变量的取值范围
不同的数据类型有不同的操作
关键字说明关键字说明
auto自动变量else条件语句否定分支,与if连用
char字符型switch用于开关语句
short 短整型case开关语句分支,与switch连用
int整型enum声明寄存器变量
long长整型typedef用于给数据类型取名
float浮点型extern外部声明
double双精度类型return函数返回语句,可不带参数
signed有符号类型union声明联合数据类型
unsigned无符号类型const常数
struct结构体continue结束当前循环,开始下一个循环
break跳出当前循环for一种循环语句
if 条件void声明函数无返回值或无参数,声明无类型指针
default开关语句中的其他分支goto无条件跳转
sizeof计算数据类型长度volatile说明变量在程序执行中可以被遗憾的改变
do循环语句的关键字,与while搭配使用while循环语句中的循环条件
static 申明静态
标识符编写风格
变量名一般小写
标记符一般采用同行的有助记的名称
在使用所写的时候,整个程序都要统一
对越多歌词构成的标识符,习惯上在每个单词之间加上下划线,或者每个单词的第一个字母大写
为变量赋值
C语言规定,在声明变量时候,可以给变量赋初值
一行可以声明多个变量,可以只给某个变量赋初值而不给其他变量初值
在程序运行时进行赋值
如果给几个变量赋予同一个值可以 int x,y,z; x = y = z =1;
可以利用函数scanf从键盘上输入值
输入输出
输入即input,输出即output,输入输出即i/o。标准i/o数据库的一些公用信息被集中放在头文件stdio.h中
printf()中的f代表单词format就是格式化的意思,所谓的格式化就是与献给程序员定义一批显示格式。
格式控制字符
格式说明信息,格式说明信息由%和格式字符组成,在格式控制字符中,凡是遇到%。说明开始了一个格式控制,函数就会读入%后面的格式控制字符,记住控制的内容。输入的时候,将数据转换成指定的格式输出
非格式化说明信息,即普通字符。普通字符就是不用%引导的字符。
eg:如果要显示一个%z可以%%,%%表示不再是一个格式控制因到付,二十一个真正的%符号
转换说明符转换说明符意义
d以十进制形式输出带符号整数(正数不输出符号)
e一直属性是输出单双精度实数,默认6位小数
f以小数形式输出单双精度实数,默认6位小数
g以%f,%e中较短的输出宽度输出单双精度实数,如果指数小于-4或但与等于精度。但使用E/e格式否则用f格式,末尾多余的0省略
i以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数
s输出字符串,参数为char指针,显示空符号之前的所有字符或者指定数目的数字,不显示末尾的空字符
c输入单个字符,参数为该字符的ASCii码
u以十进制形式输出无符号整数
x以十六进制形式输出无符号整数
%d是用的最多的格式符,表示以十进制形式输出带符号整数,正数不输出符号
在d前可以添加数字,表示输出的最小宽度。比如%5d表示显示一个整数,最小占5哥字符的宽度。如果这个数只有3位,则在前面用空格填充。如果这个位数大于5就按照实际位数输出
长整型输出%ld
%ld表示长整型方式输出。
%*md表示读入宽度m位数据后忽略丢弃
输出八进制形式 %o
输出十六进制形式 %x
输出十进制的unsigned型数据
输出字符%c
输出字符串%s
%ms :m是一个整数,这个表明这个这个字符串的最小宽度,如果字符串本身宽度不足指定的最小宽度,则前面用空格补齐。%-ms:格式表示左对齐
%m.ns:m还是指定最小宽度,而n是显示的时候,只显示字符串中前n个字符
%-m.ns:同样是指左对齐,如果现实的字符串宽度小于指定的最小宽度,则在右边补空格
输出实型数据%f
%f格式符用来输出实型数据,包括单精度和双精度,以小数形式输出。计算机中单精度实数的有效位一般为7位,包括整数和小数部分。也就是说,一个单精度实型数据有8位,则其个位数是不准确的,更别说小数位了。
双精度实型数据的有效位是16位,且输出6位小数位
%m.nf 不多说
%-m.nf 不多说
%e 不指定输出来的数据在屏幕中所含的字符个数宽度,也不指定数字部分和小数部分位数,由系统自动指定
%m.ne %-m.ne
自动选择%f或者%e形式输出%g
%g格式用来输出实数。%g跟俊实数的大小,自动选择%F格式或者%e格式,选择标准为输出时占用宽度较小的一种,且不输出没有意义0
字符输出putchar()和字符串输出puts()
putchar ()函数是字符输出函数,其功能是使在显示器上打印单个字符。
字符数据可以是一个字符型变量
字符数据也可以是一个字符变量
字符数据可以是一个整数,整数可以是十进制整数
字符数据可以是一个表达式,只要结果是255以内的整数即可
字符数据可以是转义字符
puts()函数功能比较单一或者说是非常单一,就是在显示屏上输出一个字符串并换行
字符输入函数getchar()
getchar()函数是得到字符输入函数,其功能是得到用户输入的一个字符。getchar()函数是一个标准的C语言库函数。