C语言

C语言简介
BCPL->newB->C->UNIX->Minix->Linux->gcc

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

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

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

int main()
{
    printf("hello world\n");
    return 0;
} 
   
/*
C语言以函数为单位管理代码的,一个函数就是一段具有某项功能的代码段。
main函数是程序的入口,有且只有一个
int 是一种数据类型,它表示main的执行结果是一个整数
return 功能有两个:1、结束函数的执行 2、返回一个执行结果给函数的调用者
main函数是由操作系统调用的,因此它的返回值返回给操作系统,反应了该程序是如何结束的,通常有三种情况:

   正数    出现异常(别人的错误)
   0       一切正常
   负数    出现错误(自己的错误)
   echo $? 查看上一个程序main函数的返回值

   printf/scanf 都是标准库中的函数,负责输入、输出数据,用来调试代码
   转义字符:
       键盘上一些没有的符号,用一些特殊的字符来表示,这些特殊的字符就是转义字符,\n就是其中一个
       \n  换行
       \\  打印一个\
       %%  打印一个%
       \r  回到行首
       \t  制表符Tab键,用来输出对齐
       \a  铃响
       \b  退一个字符

C语言中以;作为一行代码的结束;使用{}划分代码区域
*/

二、编译器:
负责把人能看懂的记录代码的文本文件,翻译成计算机能看懂的二进制文件,由预处理器、编译器、链接器组成
gcc是由GUN组织为了编译Linux代码而开发一款免费的编译器,默认采用c89语法标准,-std=gnu99可以设置为c99语法标准
常用的参数:
-E 显示预处理的结果
-c 只编译不链接
-o 指定编译结果的名字
-S 生成汇编代码
-I 指定头文件的加载路径
-l 指定要使用的代码库 -lm 使用数学库
-Wall 以严格的标准检查代码,显示更多的警告提醒
-Werror 把警告当错误处理
-std= 指定编译的语法标准

三、把C代码变成可执行程序的过程
1、预处理 把源文件翻译成预处理文件
gcc -E code.c 显示预处理的结果到终端上
gcc -E code.c -o code.i 生成以.i结尾的预处理文件
2、编译 把预处理文件翻译成汇编代码
gcc -S code.i -> code.s 生成以.s结尾的汇编文件
3、汇编 把汇编代码翻译成二进制的目标文件
gcc -c code.s -> code.o 生成以.o结尾的目标文件
4、链接 把若干个目标文件合并成一个可执行文件
gcc a.o b.o c.o … -> a.out
四、C文件类型:
.h 头文件
.h.gch 头文件的编译结果,它会被优先使用
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件

五、存储空间的单位:
Bit 比特 一个二进制位,只存储0或1,计算机存储数据的最小单位
Byte 字节 八个二进制位,计算机存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB

六、数据类型
为什么要对数据进行分类:
1、现实社会中的数据是自带类别的属性
2、对数据进行分类可以节约存储空间、提高运行效率

C语言中数据分为两大类:自建(程序员自己设计的,例如:结构、联合、类)和内建(C语言自带的)
   sizeof()  计算类型的字节数
   整型:
        signed 有符号
            signed char           1        -128~127
            signed short          2        -32768-32767
            signed int            4        正负20亿
            signed long           4/8      正负20亿/正负9开头的19位整数
            signed long long      8        正负9开头的19位整数

        unsigned 无符号
            unsigned char         1        0~255
            unsigned short        2        0~65535
            unsigned int          4        0~40亿
            unsigned long         4/8      0~40亿/0~1开头的20位整数
            unsigned long long    8        0~1开头的20位整数
        注意:signed不加就代表加

        注意:由于定义无符号整数数据时比较麻烦,因此标准库把这些无符号类型重新定义成了以下类型:
             需要包含头文件 stdint.h
             uint8_t uint16_t uint32_t uint64_t
             int8_t  int16_t  int32_t  int64_t

   浮点型:
          float          4
          double         8
          long double    12/16
          注意:采用科学计数法,二进制数与真实数据之间需要换算,因此计算浮点型数据比整型要慢,因此尽量选择整型使用
               小数点后6有效

   模拟:  
        char 字符型 字符其实就是符号或图案,在内存中存储的其实是整数,显示时会根据ASCII码表中对应的关系来显示对应的符号或图案
            0     '\0'  特殊字符
            48    '0'
            65    'A'
            97    'a'

        bool 布尔型  C语言中是不可能有真正的布尔类型,因为先有c语言才有的bool类型,stdbool.h对布尔类型进行模拟
             bool true false

可以使用 sizeof()计算类型的字符数

七、变量与常量
什么是变量:程序运行期间数值可以变化的叫做变量,相当于存放数据的盒子
定义: 类型 变量名;
int num;
取名规则:
1、由数字、字母、下划线组成
2、不能以数字开头
3、不能与C语言关键字(32)重名,要求默写
4、见明知意(功能、类型、范围)
注意:变量的默认值是随机的,为了安全起见,一般初始化为0
使用:
赋值: num= 100;
参与运算:num*10

变量的输入、输出:
int printf(const char *format, ...);
功能:输出数据
format:双引号包含的格式信息(提示信息+占位符)
...:变量名列表
返回值:输出字符的个数

int scanf(const char *format, ...);
功能:输入数据
format:双引号包含的格式信息(占位符)
...:变量地址列表   &变量名 <=> 变量地址
返回值:成功输入变量的个数
注意:scanf需要的是变量的类型和地址,&变量名 <=>  变量地址

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

什么是常量:程序运行期间数值不能改变的叫做常量
    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
前自变:++num --num 立即有效
后自变:num++ num-- 下一条语句才生效
注意:不要在一行代码中出现多个自变运算符

算术运算符:+ - * / %
    / % 除数不能为0,否则会产生浮点数除外,核心已转储,程序直接挂掉
    整数/整数 结果没有小数点
关系运算符:<> >= <= == !=
    比较的结果是0或者1,比较的结果还能继续参与运算
    int num = 0;
    10<num<100 永远为真,与数学的运算规则不同
逻辑运算符: && || !
    会先把运算对象转换为逻辑值,0转换假,非0值转换真
    A && B:一假即假
    A || B:一真即真
    !A   :求反
    && || 具有短路特性,当左边的值可以确定整个表达式结果时,右边的不在计算

三目运算符:运算对象有三个部分
    A?B:C  判断A的值,如果为真者执行B,如果为假则执行C
    该语句不能出现流程控制语句,因为他必须要有运算结果

赋值运算符:= += -= *= /=
    a += b    a = a+b
    a *= b    a = a*b

位运算符:& | ~ << >> ^

二、类型转换
自动类型转换:
只有相同类型的数据才能进行运算,不同类型的数据转换成相同类型才能进行运算
转换规则(以不丢失数据为基础,可以适当的牺牲一些空间)
1.字节少的向字节多的转
2.有符号的向无符号的转
3.整型向浮点型转
注意:char、short的数据与任意不同类型的数据运算时,都转换为int类型

强制类型转换:
    (类型)数据 有丢失数据的可能,慎重使用

三、分支语句
if else switch case default
if(表达式)//单分支
{
表达式为真,则执行此处代码
}

  if(表达式)//双分支
{
    表达式为真,则执行此处代码
}
else if(表达式1)//多分支
{
    表达式1为真,则执行此处代码
}
else if(表达式2)
{
    表达式2为真,则执行此处代码
}
else
{
    所有表达式都为假,则执行此处代码
}

作业:
1、输入三个整数,从小到大显示
2、输入一个年份,判断是闰年还是平年? 四闰百不闰,四百闰
3、输入一个年份和月份,判断该月有多少天?
4、输入一个三位整数,判断是否是水仙花数? abc=aaa+bbb*+ccc
5、输入一个成绩,判断等级

开关语句:
switch(n)  //n可以是数值、表达式,但是运算结果必须是整数
{
    case val:   //val 必须是整常量,如果val等于n,则打开执行开关
        ...
        break; //关闭执行开关
    default:   //如果所有的case都没有匹配成功,则最后打开此执行开关
}
注意:如果每个case后面都有break,就形成了分支结构
case a ... b:判断一个范围,但是是GNU编译器独有的语法,不建议使用

练习1:输入一个月份,判断季节
练习2:输入一个月份,判断该月有多少天,不考虑润平年问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值