c语言学习记录

前言:
C语言简介:
BCPL->new B->C->UNIX->Minix->Linux->gcc
GNU Linux
C语言诞生 1970年~1973年,在肯.汤普逊、丹尼斯.里奇主导下编写完成,归属于美国贝尔实验室
C语言专门用于编写操作系统,所以天生适合硬件编程,也以速度快著称,也非常适合实现数据结构和算法
由于出现时间过早,有很多缺陷,由于没想到普通人也能使用C语言编程,因此存在着很多缺陷,但是前辈总结了一些避免陷阱的经验《C语言陷阱与缺陷》
c语言三剑客
C语言语法很自由,自由也意味着危险,自由源于自律

C89语法标准,也是gcc默认的语法标准
C99语法标准,对C语言的扩展和增强 -std=gnu99 
C11语法标准,全新的升级

一、第一个C程序:
#include <stdio.h>
程序员所写的代码不是标准C代码,需要一段程序进行翻译成标准C代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都是预处理指令。
#include 的功能就是把一个头文件导入到当前的文件中
#include <xxx.h> 从系统指定目录下加载xxx.h
#include “xxx.h” 先从当前目录下加载xxx.h,如果找不到,再从系统指定目录加载
stdio.h 标准输入输出库函数
头文件:以.h结尾的文件,里面储存的是一些辅助性的代码,绝大多数都是函数的声明
源文件:以.c结尾的文件,里面记录的是功能性的代码
C语言标准委员会为C语言以函数的形式提供了一些基础的功能,这些函数都会封装在libc.so库中
很多的头文件负责对libc.so库中的代码进行说明,stdio.h就是其中的一个。
string.h stdlib.h

int main()
C语言以函数的形式来管理代码,是管理代码的最小单位,一个函数就是一段代码的集合
main函数是C程序的主函数,是整个C程序的执行入口和出口,有且只有一个。
int 是一种数据类型,表示main函数的返回值类型是一个整数
main函数的返回值返回给操作系统,main函数是由操作系统调用的,反映了该程序是如何结束的,通常有三种:
正数 出现异常【别人的错误】
0 一切正常
负数 出现错误【自己的错误】

    echo $? 可以获取上一个程序的返回值

{
printf(“Hello World!\n”);
return 0;
}
printf/scanf都是标准库中的函数,负责输入、输出数据,用来调试程序
转义字符:键盘上一些没有的符号,用一些特殊的字符来表述,这些特殊的字符就是转义字符,\n就是其中之一。
\n 换行
\t 制表符,用于对齐数据
\r 回到行首
\a 铃响
\b 退一个字符
%% 表示%
\ 表示
C语言中以分号作为一行代码的结束标志,使用大括号来划分区域

二、编译器
负责把人能看懂的代码组成的文本文件,翻译成计算机能看懂二进制文件,由预处理器、编译器、链接器组成。
gcc是GNU社区为了编译Linux代码而开发的一款免费的编译器,默认采用C89语法标准,-std=gnu99可以设置C99语法
常用的参数:
-E 显示预处理的结果
-c 只编译不链接
-o 指定输出结果的名字
-I 指定头文件的加载路径
-S 生成汇编代码
-l 指定要使用的库文件
-Wall 尽可能多地产生警告
-Werror 把警告当做错误处理
-std 指定编译语法

三、C代码变成可执行程序的过程:
1、预处理: 把源文件翻译成预处理文件
gcc -E code.c 显示预处理的结果
gcc -E code.c -o code.i 生成以.i结尾的预处理文件
2、编译: 把预处理文件翻译成汇编文件
gcc -S code.i 生成以.s结尾的汇编文件
3、汇编: 把汇编文件翻译成二进制的目标文件
gcc -c code.s 生成以.o结尾的目标文件
4、链接 把若干个目标文件合并成一个可执行文件
gcc code.o a.o b.o c.o … 默认生成一个a.out的可执行文件

四、C文件类型:
.h 头文件
.h.gch 头文件的编译结果,它会被优先使用
.c 源文件
.i 预处理文件
.s 汇编文件 .S
.o 目标文件
.a 静态库文件
.so 共享库文件

五、数据的储存单位:
Bit 比特 一个二进制位,只能存0或者1,计算机中存储数据的最小单位
Byte 字节 八个二进制位,计算机中储存数据的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
六、数据类型
为什么要对数据进行分类:
1、现实生活中的数据都是自带类别属性
2、对数据进行分类可以节约储存空间,提高运行效率
C语言中的数据分为两个大类:自建(程序员自己设计,例如:结构、联合、类)、内建(C语言中自带)
可以使用sizeof计算类型的字节数大小 sizeof(signed long)
整型:
signed 有符号
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 正负20亿
signed long 4\8
signed long long 8 ±以9开头19位数字的整数
注意:signed不加就代表加

    unsigned    无符号
        unsigned char         1     0~255
        unsigned short        2     0~65535
        unsigned int          4     0~40亿
        unsigned long         4\8
        unsigned long long    8     1开头的20位正整数
        注意:由于定义无符号的数据时比较麻烦,标准库把这些无符号的类型重新定义成以下类型:
        需要包含一个头文件<stdint.h>
        uint8_t uint16_t uint32_t uint64_t
        int8_t  int16_t int32_t int64_t
浮点型:  
    float       4         %f
    double      8         %lf
    long double 12/16      %LF
    注意:采用科学计数法储存,二进制与真实的数据之间需要翻译转换,因此浮点型运算速度就比整型要慢,编程时尽量采用整型
    小数点后6位有效 0.000001
    判断float类型的数据是否是0
    float num;
    if(num  0 <= 0.000001 || num >= -0.000001)
模拟
    字符型  char     %c
        char 字符其实就是符号或者图案,但是,在内存中储存的是整数,需要显示字符时,会根据ASCII码表中对应关系来显示相应的符号或者图案。
        0   ''  特殊字符,表示什么都没有
        48  '0'
        65  'A'
        97  'a'
    布尔型  bool
        由于先有C语言后才有了bool类型,所以C语言不可能有真正的布尔类型,使用stdbool.h头文件,该文件是对布尔类型做的模拟
            bool true false
    
    可以使用sizeof计算类型的字节数大小 sizeof(signed long)

七:变量与常量
什么是变量:程序运行期间数值可以发生改变的叫做变量,相当于储存数据的盒子。
定义: 类型 变量名;
int num;
int num1,num2,num3;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与32个C关键字重名,能默写
4、见名知意 【功能、类型、作用域…】
使用:
赋值:num = 100;
参与运算:num*10;
注意:C语言中变量的值默认是随机的,为了安全起见,一般都初始化为0

变量的输入输出:
    int printf(const char *format, ...);
    功能:输出数据
    format:"双引号包含的格式信息(提示信息+占位符)"
    ...: 要输出的变量的列表
    返回值:输出字符的个数
    printf(提示信息+占位符+变量列表)
    scanf(占位符+变量的地址&)
    int scanf(const char *format, ...);
    功能:从键盘输入数据
    format:"双引号包括的格式信息(占位符)" 
    ...:要接收的变量的列表 
    返回值:成功输入变量的个数
    注意:scanf需要的是变量的类型、变量的地址 ,变量的地址 = &变量名

练习1:定义各种类型的变量并初始化,使用scanf输入,然后使用printf显示
int main(int argc,const char* argv[])
{
    int num = 0;
    printf("请输入num的值:");
    scanf("%d",&num);
    printf("num=%d\n",num);
}

类型占位符:C语言通过占位符来传递变量的类型
  signed:   %hhd %hd %d %ld %lld
  unsigned: %hhu %hu %u %lu %llu
            %f %lf %LF 

什么是常量:程序运行期间数值绝对不能改变的叫常量
    字面值常量
        100 'a' "hello world"
    枚举常量
    宏常量
    100 默认是int类型
    100l long
    100ll long long
    100u unsigned int
    100lu unsigned long
    100llu unsigned long long
    3.14  默认是double类型
    3.14f   float

八、格式化输入输出
%nd 显示n个字符宽度,不够则补空格,右对齐
%-nd 显示n个字符宽度,不够则补空格,左对齐
%0nd 显示n个字符宽度,不够则补0,右对齐
%n.mf 显示n个字符宽度,小数点也算一位,不够则补空格,m表示显示小数点后的位数(四舍五入)
%g 不显示小数点后面多余的0

九、运算符
自变运算符:前后++/–,使变量的值自动加1或者减1
前自变: 立即有效
后自变: 下一句语句有效
注意:不要在一行语句中多次使用自变运算符
算术运算符:+ - * / %
/ % 除数不能为0,会造成浮点数例外,核心已转储,程序直接死掉
整数/整数 结果没有小数部分
关系运算符:> < >= <= == !=
比较的结果是0(假)或者1(真),运算结果可以继续参与运算
if((a>b) == 0)
int num = 500;
0<num<100; 永远为真
逻辑运算符: && || !
比较对象转换为逻辑值,0转换成假,非0转换为真
A && B: 一假即假
A || B:一真即真
!A: 求反
&&、|| 具有短路特性:
当左边的表达式可以确定整个表达式的结果时,右边不进行计算
三目运算符:运算对象有三个
A?B:C
判断A的表达式真假,如果为真执行B,如果为假执行C
int i = 10;
int num = 10 == i?100:1000;
注意:该语句不能使用流程控制语句,因为它必须要有运行结果
赋值运算符:= += -= *= /=
num+=100 <=> num = num + 100;
位运算符:
& | ~ ^ >> <<

十、类型转换
自动类型转换:
只有相同类型的数据才能进行运算,不同类型数据自动转换成相同类型再进行计算:
转换规则(以不丢失数据为基础,适当牺牲一些空间)
1、字节少的向字节多的转 考虑优先级
2、有符号的向无符号的转
3、整型向浮点型转
强制类型转换:
(想要转成的类型)原来的数据;
int num;
(short)num;
注意:有丢失数据的风险,慎重使用

十一、分支语句
if(1表达式) //单分支
{
表达式值为真,执行此处代码
}

if(表达式)     //双分支
{
    表达式值为真,执行此处代码
}
else
{
    表达式值为假,执行此处代码
}

if(表达式1)
{
    表达式1 值为真,执行此处代码
}
else if(表达式2)
{
    表达式2 值为真,执行此处代码
}
else if(表达式3)
{
    表达式3 值为真,执行此处代码
}
else
{
    当表达式123都为假时,执行此处代码
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值