C语言简介:
时间:1970~1973 作者:丹尼斯.里奇 肯.汤普逊 地点:贝尔实验室
目的:编写操作系统 UNIX->Linux BCPL->newB->C
特点:速度快,语法简洁(32个关键字),功能强大(对硬件支持)。
缺点:可用的库少,由于语法简洁导致代码不易阅读。
第一C程序:
程序员所编写代码不是标准C代码,不能直接编译,它一段把它翻译成标准的C代码,
负责翻译的程序叫预处理器,翻译的过程叫预处理,被翻译的代码叫预处理指令
(以#开头)。
#include 导入一个头文件到源文件。
.h 结尾的文件叫头文件,里面记录的大多数都是函数的开头(函数声明);
.c 结尾的文件叫源文件,里面记录的具体功能实现代码。
<> 从系统指定的目录加载头文件
"" 先从当前目录下加载头文件,如果找不到再从系统指定目录加载头文件。
系统通过环境变量来指定加载头文件的目录。
stdio.h standard in out 记录的是与标准输入输出有关的辅助代码。
#include <stdio.h>
C语言以函数为管理代码的最小单位,一个函数就是一段具有某项功能的代码。
main函数是程序的默认入口(可以修改,但需要手动编程链接脚本),有且只能有一个。
int是一种数据类型,放在函数名前表示函数的返回值是int类型,函数的返回值是就函数执行的结果,会交给函数的调用者。
main的调用者就是操作系统,因此main的返回值就交给的操作系统,被记录在了系统日志中。
main函数的返回值代表程序是以什么状态结束的:
正数:表示程序出现异常
负数:表示程序出现错误
0:表示一切正常
在C语言中大括号用来划分区地盘,被大括号包含的代码表示属于一个整体。
int main()
{
标准库是C语言标准委员为C语言提供一些基础功能(以函数形式提供的),
封装在libc库中。printf/scanf是标准库中的函数,用来输入输出数据,
一般用它来调试程序,项目在真正运行则 不使用。
"字符串字面值,可以直接被printf输出"
\n是一种转义字符,不能直接被表示的符号:
\r 回到行首
\b 退格
\t 制表符,相当于按一下tab键
\a 铃响
%% 表示一个%
\\ 表示一个\
C语言中以分号表示代码的结束,当代码太长时可以直接换行。
return:
1、可以立即结束函数的执行,即使下面还有代码。
2、把一个数据返回给函数的调用者。
printf("hello world!\n");
return -1;
}
C代码是如何变量成可执行程序的:
1、预处理 :gcc -E code.c 会把预处理的结束显示在屏幕上。
gcc -E code.c -o code.i 把预处理的结果保存在文件中。
2、汇编:gcc -s code.i 把标准的C代码翻译成汇编代码
会生成一个以.s结尾的汇编文件。
3、编译:gcc -c code.s 把汇编代码翻译成纯二进制代码
会生成一个以.o结尾的目标文件,已经可以被执行,只是没有入口
4、链接:gcc code1.o code2.o ... 把若干个.o文件合并成一个可以执行的文件。
C语言的数据类型:
编程语言为什么要把数据进行分类?
结构存储空间、提高运算速度。
整型:
signed 有符号整型,存储数据的二进制位的最高位用来表示正负,
最高位也叫符号位,signed不加就代表加。
char 1 -128~127
short 2 -32768~32767 (2^15)
int 4 -2000000000~2000000000
long 4/8
long long 8
unsigned 无符号整型,所有的二进制位都用来代表数据,只能表示正数,
unsigned必须要加。
char 0~255
short 0~65535 (2^16)
int 0~4000000000
long
long long
浮点型:
单精度:float 4
双精度:double 8
高精度:long double 12/16
浮点型采用科学计数法来表示数据:符号位+指数位+尾数位。
浮点型小数后六位有效,数据默认只显示小数点六位。
char 字符就是符号或图案,在计算机以整数存储,当需要以字符形式显示时,
计算机会根据ASCII表中的对应关系显示出相应的符号。
48 '0'
65 'A'
97 'a'
0 '\0'
bool 在计算机界1980年以后才开始流行,因此C语言中不可能有真正的布尔类型,
如果想使用需要包含stdbool.h头文件。
true=1 false=0
变量:
程序运行过程中可以修改的量,可以用来存放数据。
定义:数据类型 变量名;
1、由变量的功能确定变量的取值范围,根据变量的取值范围确定变量的类型。
2、变量的默认值不确定,为了安全建议给一个初始值。
3、变量的取名要符合规定、标准:
1、由数字、字母、下划线组。
2、不能以数字开头。
3、不能与关键字重名。
-------------
4、尽量不要超过30个字符
5、见名知意 变量名(使用范围,功能,类型)
使用:赋值、参数运算
变量的输出:printf 类型 变量名
C语言中使用占位符的方式来告知变量的类型。
signed:char,short,int,long,long long
%hhd,%hd,%d,%ld,%lld
unsigned:char,short,int,long,long long
%hhu,%hu,%u,%lu,%llu
浮点型:float,double,long double
%f,%lf,%LF
字符型:char %c
变量的输入:scanf 类型 变量地址=&变量名
注意:不带\n
常量:
程序运算不能改变的量。
字面值:
1000 表示的是 int
1000u 表示的是 unsigned int
1000lu 表示的是 unsigned long
1000llu 表示的是 unsigned long
3.14 表示的是 double
3.14f 表示的是 float
"hehe" 表示的是 const char*
受保护的变量:
const int num;
枚举值
宏常量
运算符:
算术运算符:+ - * / %
/ % 除数不能为零,会出现"浮点数例外,(核心已转储)",导致程序死亡。
关系运算符:> < >= <= == !=
3 < num < 9 <=> 3 < num && num < 9;
注意:C语言中的运算规则与数学中的不同。
== 变量尽量放在右边,常量放在左边。
100 = num; 会有错误提示
num = 100; 变成了赋值语句
自变运算符:++/--
不要一个表达式中过多使用,不同的编译器对自变运算符的处理顺序不一样。
逻辑运算符:&& || !
&&、||具有短路特性,当运算左边的值已经可以确定表达式结果时,右边的不再计算
,适当的利用短路特性可以写精简的分支结构。
if(num < 100)
{
num++;
}
num < 100 && num++;
单目运算符,运算优先级别比&&、||高。
赋值运算符及扩展:+= -= *= /= ...
num *= 10+n;
num = num * (10+n);
三目运算符:[1]?[2]:[3];
注意:不能使用流程控制语句,
因为三目运算符始终是一个表达式必须要有一个结果。
字节宽度运算符:sizeof
sizeof不是函数,而是计算数据类型所点字节数的关键字。
sizeof不计算小括号中的表达式,它只是推算表达式结果的类型然后计算
这个类型所占的字节数。
位运算符:& | ~ ^ >> <<