C语言基础
程序编译
- gcc xx.c会默认生成一个a.out的可执行文件,在a.out所在目录下执行,执行./a.out
- 程序编译可以用gcc XX.c -o XX ,注意不要命名成xx.c,这样会覆盖原先的xx.c文件内容。
- gcc xx.c -o xx -g -wall,-g -wall的意思是开启所有的语法警告。
- gcc只检查语法错误,不会检查逻辑错误。
- 每次修改完程序,都必须要执行一次gcc。
hello world程序
int main()
{
return 0;
}
- 可执行程序一执行,就会去找一个叫做main的函数,然后运行main{}里的语句。
- 一个.c文件有且只能有一个main的函数。
- 一个函数碰到return就会结束,return后面的语句将永远不会被执行。
- 如果是main函数,他可以将前面的int省略,return也是可以省略的。
- main(int argc,char *argv[])
-
include <stdio.h>是一个C语言标准输出输入库。
注释
- //代表单行注释,
- /* code */代表多行注释。
- /* 会与碰到的第一个//*/匹配
- //可以用来附加解释的作用,或用来注释代码
- 写清文件名,文件产权,文件制作方,如果是某人,要写清联系方式。
printf:打印函数
- 打印""里面的语句
- \n是转义字符代表换行
int main()
{
int a=6;
float b=9.8;
printf("a=%d,b=%f",a,b);
}
- %d:是占位符,输出整数
- %c是占位符,输出字符
- %f是占位符,输出浮点数
- %lf是占位符,输出double类型的数据
- printf("%m.nf");
- m<n+1+小数点前的个数时,无意义
代码格式
main()
{
}
注意:每碰到一个{,就来个tab退格
常量
- 1,2,3,4:整形常量
- 'a','b','c':字符常量
- 1.2,2.3:浮点常量
- "hello world":字符串常量
- 0xfff321:地址常量
- 常量的特点:
- 常量不会改变
- 常量不能作为左值
- 0,const(只读常量),define(宏常量)
变量
- 变量的特点
- 可以改变的量
- 可以作为左值,也可以作为右值
- 变量的定义
- 在shell脚本里:变量名=值
- 在C语言里十数据类型加变量名
- 同时定义多个同类型变量:数据类型 变量a,变量b;
- 数据类型
- 整形数据类型:int
- 字符型数据类型:char
- 浮点型:float(单精度),double双精度()
- 数据类型的作用
- 标志着后面的变量具体是接受什么类型的值
- 这个变量再内存中占几个字节
int:4 char:1 float:4//float是精确到 double:8//double是精确到
- 整形变量
- int value=1;
- int value;value=1;
- 字符变量
- char ch='c'
- char ch;ch='d'
- 浮点变量
- float f1=1.2
- float f2=1.4
- 变量的使用
- int value;value=8;
标识符的规范
- 硬性规范:
- 不能用数字开头
- 不能与C语言关键字相同
- 只能由字母下划线和数字组成
- 建议规范
- 不能用拼音,多查字典
- 尽量使用驼峰命名法numOfStudent,num_of_student
- 见名知义
地址
- 内存:字节:Byte式计算机存储的最小单位
- 1M=1024KB;1KB=1024Byte;1Byte=8bit
- 地址:地址是每一个字节所对应的编号
- (中国===>家庭(屋子)===>门牌号)
- (计算机===>字节===>地址)
进制
- 二进制:0~1
- 八进制:0~7
- 十进制:0~9
- 十六进制:
- 0~15:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。
- 0X开头
大端小端存储法
- 小端法存储:低位上的数存储在低的地址所对应的字节里。hston
- 大端法存储:低位上的数存储在高的地址所对应的字节里。hntos
- 用处:用于网络传输内容的时候。
打印特殊字符
- 如何打印"":printf("\"abc\"\n");
- 如何打印'':printf("'abc'\n");
- 如何打印%:printf("%%");
- 如何打印\:printf("\\");
字符与ASCll码
- 字符是一个特殊的整形,只占8位
- 记住的字符
int main()
{
char ch='a';
printf("ch=%d\n",ch);
//'2'+'2'=100='d'
}
'\0'=0
'0'=48
' '=32
'A'=65
'a'=97
- 全球停用编码:unicode编码
scanf(scan formatter:格式化输入函数)
- scanf("%d",&a);//&a:取a变量的地址
- scanf后面必须是取某个变量的地址
- 一个变量必须先定义出来再进行scanf
- scanf("%d%d",&a,&b);
- scanf后面不要加\n。
getchar()与putchar()
int main()
{
char ch;
ch=getchar();
putchar(ch);
}
输入字符可以直接输出。
数据类型转换
- 隐式转换:精度小的====>精度大的
- char====>short int====>float====>double
- 强制类型转换:(type)变量
int a=9;
int b=8;
float c=(float)a/b;//强制转换的是a的值,而不是a,所以a还是int类型。
运算符
- 注意点:计算机只进行相同类型数据的运算,最后计算出来的结果也与他们的数据类型相同。
float a=9;
int b=8;
float c=a/b;
printf("c=%f",c);//结果为1.125000
分析:通过隐式转换,将b改为float类型,8.000000,然后计算结果。
- 算数运算符:+ - * / % ++
- %后面必须是整数
- ++
- 前缀++
int a=9; int b=++a;//a=a+1,b=a.
- 后缀++
int a=9; int b=a++;//b=aa=a+1.
- 前缀--
int a=9; int b=--a;//a=a-1,b=a.
- 后缀--
int a=9; int b=a--;//b=a,a=a+1.
- 位运算符
- |:位或:有1为1
- &:位与:有0为0
- ^: 异或: 只要不同就为1
- ~: 取反:先得补码再取反
a=3; ~a=-4; 3:0000 0011 对补码取反:1111 1100(此时变为负数) 反码为:1111 1011 原码为:0000 0100
a=-3; ~a=2; -3:1000 0011 码反:1111 1100 补码为:1111 1101 取反:0000 0010 原码:0000 0010
- 原码,反码,补码
- 正数的原码和反码补码相同
- 负数的反码在原码的基础上符号位不变,后面依次取反。负数的补码在反码基础上+1
问题:1+(-1)会得到结果-2 数据在内存中是以数据的补码存在 数据是以补码存在,原码输出。
- 左移<<
a=3;
b=a<<2;//b=12
0000 0011
0000 1100
b=a>>2;//b=0
0000 0011
0000 0000
a=-3
b=a<<2;//b=-12
1000 0011
1111 1100
1111 1101
1111 0100
1111 0011
1000 1100
a=-3
b=a>>2;//b=-1
1000 0011
1111 1100
1111 1101
1111 1111
1111 1110
1000 0001
- ch的范围
- -128~127
char ch=127;可以正常输出 char ch=128;输出为-128//1000 0000 默认为-128 char ch=129;输出为-127.
小结:总的来说大部分知识都听过,但是在最下面讲的计算机都是以补码的形式计算,原码输出,二进制进行存储的。这一点以前虽然知道但没细究,所以这次计算过了一次~运算突然发现自己以前计算的方式有点错误,以前3取反我算到1111 1100时根本没想到会变成负数,所以多了一步负数转原码的过程。总的来说,还是学到了新的知识。