四、C语言基础
1.第一个c语言程序
Inc tab 键 补全头文件main tab 键 补全主函数#include <stdio.h>#include "stdio.h"int main ( int argc , const char * argv []){printf ( "hello world\n" ); // 打印hello wordreturn 0 ;}# 预处理标识符#include 包含头文件的固定格式 (/usr/include)stdio . h 头文件<> 从 c 语言的标准库查找头文件"" 从指定目录下进行文件的查找如果查不到,我就去库函数中继续查找int 函数的返回值类型main 主函数 , c 语言程序有且只有一个主函数,是 c 程序的入口int argc , const char * argv [] 是一个外部传参{} 函数体,所有的代码都在里面写。printf () 打印函数"hello world" 字符串常量\n 换行; 分号 c 语言代码这一行的结束的标志,必须有,没有分号会 报错// 单行注释 多行注释 /* */ #if 0 # endifreturn 退出函数return 0 退出函数并且返回一个数据 0return 的作用 :1. 函数的返回值2. 终止后续代码的执行1. 回答 吃 return sum2. 回答 我选亚索 return 13. 不回答 return 终止后续代码的执行。
2.gcc
编译器
2.1
直接编译
gcc
文件名
.c
会自动生成一个可执行文件
(
二进制文件、机器码
)
默认是
a.out
运行程序
./a.out
2.2
分布编译 第一个面试题
40%~60%
ESc . iso1. 预处理 E . i代码 : gcc - E 文件名 . c - o 文件名 . i作用 : 1. 头文件的展开 2. 宏的替换 ( ? ) 3. 删除注释 ( 提高代码运行速度 ) 4. 不会检查语法错误2. 编译 S . s代码 : gcc - S 文件名 . i - o 文件名 . s作用 : 需要检查语法错误 , 会生成一个汇编文件3. 汇编 c . o代码 : gcc - c 文件名 . s - o 文件名 . o作用 : 将汇编文件转换为二进制文件,但是没有链接到库,不可执行4. 链接库代码 : gcc 文件名 . o - o 可执行文件运行 . / 可执行文件
3.宏定义
3.1
无参宏定义
格式:
#define 宏名 宏体示例:#define N 2
3.2有参宏定义
等到后面讲函数,重新拿出来格式#define 宏名 ( 参数 1, 参数 2) 宏体示例#include <stdio.h>#define N 2#define ADD(a,b) a+bint main ( int argc , const char * argv []){printf ( "hello\n" );printf ( "%d\n" , N );printf ( "%d\n" , ADD ( 1 , 2 ));return 0 ;}
3.3注意事项
1. 将宏定义放置在头文件之下2. 宏名必须大写 ( 默认的潜规则 --- 为了区分函数 )3. 宏定义不需要加分号4. 宏就是一个简单的替换 , 如果传入的参数要优先运行,必须加上括号 #define SUB ( a , b , c , d ) a * ( b + c ) + d5. 面试中的一半 预处理阶段6. 宏体一定是一个表达式
3.4练习
#include <stdio.h>#define M(x,y,z) x*y+zint main ( int argc , const char * argv []){int a = 1 , b = 2 , c = 3 ;printf ( "%d\n" , M ( a + b , b + c , c + a ));return 0 ;}注意 简单的替换计算步骤 :1 + 2 * 2 + 3 + 3 + 1 = 1 + 4 + 3 + 3 + 1 = 5 + 7 = 12一个水分子的质量是 3 . 0 * 10 ( - 23 ) g , 1 夸克脱水大约有 950g ,写一个程序要求输入水的夸克数,计算这么多水中包含多少水分子?科学计数法 3.0e-23 % e2 * 950 / ( 3.0e-23 )#include <stdio.h>#define G 950#define K 3.0e-23#define S(a) (a)*G/(K)int main ( int argc , const char * argv []){printf ( "%e\n" , S ( 2 ));return 0 ;}
4.
数据类型及变量
1.
计算机的单位转换
1 Tb = 1024 Gb1 Gb = 1024 Mb1 Mb = 1024 Kb1 Kb = 1024 byte1 byte ( 字节 ) = 8 bit1 bit 位 只能存储一个 0 或者 一个 1
2.常量的数据类型
1. 整形常量 % d1 0 100 32. 浮点型常量 % fPI 3.1 9.8 - 3.4 1.1 . 2.3 ( 错误 )3. 字符类型的常量 ---- 由单引号包含起来的单个字符 % c'1' '-' '0' 'a'ascii 国际通用的编码方式 man ascii'0' ~ '9' 48 ~57 '0' 48'A' ~ 'Z' 65 ~90 'A' 65'a' ~ 'z' 97 ~122 'a' 97'\n' 104. 字符串常量 由双引号包含起来的一个或多个字符。"asdsafga" "a" "!@#$%%"5. 标识符类型的常量#define N 1 # define STR "1234"
3.基本数据类型
4.
变量
4.1.
申请变量
格式 :单个变量的声明 存储类型 数据类型 变量名 ( 标识符 )多个变量的声明 存储类型 数据类型 变量名 1 , 变量名 2 ....auto int a <-----> int a
4.2.存储类型
auto 默认类型extern 引用其他文件的变量static 静态变量 ( 网络编程、 IO )底层课程volatile 去内存中获取变量register 寄存器变量
4.3.变量名
语义化命名1. 变量的初始化以及赋值int a ; a 的值是一个随机值 , 但是int b = 1 ; 用常量进行初始化int c = b ; 用其他变量进行初始化int d ; // 先定义一个变量整形变量 b, 所占空间大小为 4byted = 4 ; // 给这个变量 d 赋值常量 42. 标识符的命名规则2.1 不能以数字开头2.2 由字母、数字、下划线组成2.3 严格区分大小写2.4 不能以关键字重名3. 关键字32 个 -- 由系统定义的语法,有特殊的含义auto for ifextern long long shortstatic charvolatile doubleregister intfloat
4.4.修饰的关键字
1. 常用的修饰数据类型的关键字有符号 signed可以区分正负的 , 可以修饰 int char ,且是一个默认的类型int a = - 10 ; <----> signed int a = 10 ;char c = 10 ; 10 是字符所对应的 ascii 码值无符号 unsigned没有负数 , 只能为正数,可以修饰 int charunsigned int a = 10 ;unsigned int b =- 10 ; // 肯定是一个正数
4.5.取值范围
1. char所占空间大小 1 byte = 8 bitunsigned char 最小值 0 最大值 2 ^8 - 1 [ 0 , 255 ]signed char 符号位 0 正数 1 负数 [ - 128 , 127 ]2. int
4.6.原、反、补
正数的原、反、补都是本身原码 : 人脑能够识别出来的二进制形式+ 0 = 0000 0000- 0 = 1000 0000反码 :正数 : 反码就是原码本身负数 : 符号位不变,其他位取反+ 0 = 0000 0000- 0 = 1111 1111补码 :正数:补码就是原码本身负数 : 补码就是在反码的基础上 , 最后一位 + 1+ 0 = 0000 0000- 0 = 1000 0000 原码 1111 1111 补码 1 1000 0000 补码 1000 0000 与 - 128 的结果一样
4.7.占位符
% d 以有符号的十进制格式输出 int char% ld 以有符号的十进制格式输出 long int% nd n 代表的是宽度,不够的补空格% f 单精度浮点型输出% lf 双精度输出% . mf m 代表的保留几位数字% c 以字符形式输出% s 以字符串输出% p 以变量的地址形式输出% e% o 八进制
5
、基本输入输出函数
5.1
单个字符的输入与输出
1. 输入getchar ()功能 : 从终端输入单个字符原型 : int getchat ( void ); //void 代表为空示例 :char c ;c = getchar (); // 假设我这里输入 hello , 只能拿出第一个字符 hint d = getchar ();2. 输出putchar ()功能 : 从终端输出字符int putchar ( int x )示例: 5.2 格式化输入与输出5.4 练习5.4 转义字符putchar ( 'a' ); //aputchar ( '\n' ); // 换行putchar ( 'c' ); //cputchar ( 10 ); // 换行putchar ( 97 ); // 字符 aputchar ( 10 );
5.2格式化输入与输出
1. 输出printf ();原型 : int printf ( const char * format ,...)printf ( "hello world %d %f" , 1 , 1.1 );注意 :1.1 . 双引号中填入要输出的数据,填什么输出什么,除了格式符和转义字符1.2 . 占位符的个数,要去后面不定参数 (...) 个数一致,不定参数之间,需要用逗号隔开2. 格式化的输入功能 : 终端输入原型 : int scanf ( const * format ,...)scanf ( " 格式符 , 格式符 " , & ( 取地址符 ) 变量名 );示例 :scanf ( "%d%d" , & a , & b );注意事项 :2.1 scanf () 一次只能识别到空格 , tab 键, \n 之前2.2 需要格式符和存储的数据类型保持一致2.3 把 & 加上2.4 不要在 scanf () 写 \n2.5 终端输入时一定要和 scanf () 里面的格式符的格式保持一致
5.4练习
用 scanf 先从终端获取一个 int 的数据类型,打印结果 ;然后再用 scanf 从终端获取一个字符类型的变量,打印他们的结果
5.4转义字符
\n 换行\t 水平制表符 tab 键的大小%% 打印 %\ " 打印 "\\ 打印 \
报错信息
bash : cd : 111 : No such file ( 文件 ) or directory ( 目录 )bash : cd : root : Permission denied 访问被拒绝mkdir : cannot create directory ‘day1’ : File exists ( 存在 )rmdir : failed to remove 'day2' : Directory not empty ( 空 )cp : - r not specified ( 规定、指定 ); omitting ( 省略 ) directory './day2'1. c : 6 : 2 : error : expected ( 期望 ) ‘ ; ’ before ( 在 ... 之前 ) ‘return’error : ‘k’ undeclared ( 未定义、未声明 ) ( first use in this function ( 函数 ))format ‘ % c’ expects argument ( 参数 ) of type ‘char * ’ , but argument 2 has type ‘int’ [ - Wformat = ]