C语言入门介绍

  • C语言简介
  • 1.第一个C语言程序
  • 2.编辑器
  • 3.C代码变成可执行文件的详细过程
  • 4.C语言文件类型
  • 5.存储空间的单位
  • 6.数据类型
  • 为什么要对数据进行分类
  • C语言中数据类型
  • 7.变量和常量
  • 8.格式化输入和输出
  • 9.运算符
  • 1.自变运算符
  • 2. 算术运算符
  • 3.关系运算符
  • 4.逻辑运算符
  • 5.三目运算符
  • 6.赋值运算符
  • 7.位运算符
  • 10.分支语句


C语言简介

  1. BCPL->new B->C语言->UNIX->Minix->Linux->gcc
  2. C语言诞生于1970~1973年,在肯.汤普逊和丹尼斯.李奇的编写下完成,归属于美国贝尔实验室。
  3. C语言是专门用于编写操作系统而发明的编程语言,所以天生适合对硬件的编程,也以运行速度快而著称,也非常适合实现数据结构和算法。
  4. 由于出现的时间过早,有很多缺陷、也存在着很多的陷阱,但是我们的前辈给我们总结了一些避免陷阱和缺陷的经验教训《C陷阱与缺陷》
  5. C语言的语言很自由,但是也意味着危险,自由源于自律。
  6. 89语言标准,默认是gcc编译器的语法标准。
    C99语法标准,是对C语言的扩展和增强,
    Ubuntu 16.04 默认C99
    -std=gnu99 指定为C99语法标准。
    C11语法标准,全新的升级

1.第一个C语言程序

vim  xxx.c 创建.c结尾的源文件
编写代码,并保存退出
gcc xxx.c编译.c源文件,成功会得到a.out的可执行文件
./a.out 运行可执行文件
  注意:可以合并3、4
  gcc xxx.c && ./a.out
  1. #include<stdio.h>
    程序员所编写的代码不是标准C代码,需要一段程序把它翻译成翻译成标准C代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的代码叫做预处理指令
#include 功能是导入头文件
        #include <xxx.h>
            <>从系统指定路径查找头文件并导入
        #include "xxx.h"
            " "先从当前工作路径找,如果找不到再从系统指定路径查找并导入
    stdio.h 
        头文件:以.h结尾,里面存放的是辅助性代码,绝大多数都是函数的说明
int main(void)
{
    printf("Hello world!\n");
    return 0;
}
  1. main()函数:
    C语言以函数为单位管理代码,一个函数就是一段具有某一项功能的代码段
    main函数是程序的执行入口,必须有且只能有一个main函数
    int是一种数据类型,它表示main函数的执行结果是一个整数
    return 功能有两个:
    1、结束函数的执行
    2、返回一个结果给函数的调用者
    mian函数的调用者是操作系统,它的返回值是给了操作系统的,它的值能反映出程序是如何结束的,一般有三类:
    1.正数 出现异常 (别人的错误)
    2.0 一切正常
    3.负数 出现错误 (自己的错误)
    printf/scanf 是标准库中的函数,负责输出数据和输入数据
    printf(“想要输出的内容”);
转义字符:
     键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,这种特殊的字符组合称为转义字符,\n就是其中之一
     \r   回到行首 
     \t   制表符,相当于Tab,用于输出格式的对齐
     \b   退格键
     \a   铃响
     \\   表示一个\
     %%   表示一个%

 C语言中以分号作为一行代码的结束,使用大括号划分不同区域

2.编辑器

负责把人能看的懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成
gcc是由GNU社区为了编译linux内核代码而开发的一款免费的编译器

gcc常用的编译参数:
    -E              只显示预处理的结果到终端
    -std=gnu99      设置C99的语法标准
    -c              只编译不链接 
    -o              指定编译结果的名字 -oname -o name
    -S              生成汇编代码
    -I              指定头文件的加载路径 -I 加载路径
    -Wall           尽可能多地产生警告
    -Werror         把警告当做错误处理
    -l              指定要加载的代码库  -lm 使用数学库

3.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 a.o b.o c.o ... 默认生成a.out可执行文件

4.C语言文件类型

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

5.存储空间的单位

Bit  比特   一个二进制位,只能存储0或者1,计算机中储存数据的最小单位
Byte 字节   八个二进制位,计算机存储器描述存储容量的基本单位
KB   1024字节
MB   1024KB
GB   1024MB
TB   1024GB
PB   1024TB

6.数据类型

为什么要对数据进行分类

1、现实生活中的数据本身就自带类别属性
2、对数据进行分类,可以节约存储空间、提高运行速度

C语言中数据类型

C语言中数据分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(C语言自带的类型)
注意:运算符sizeof可以计算类型、变量的字节数

整型:                                          
                signed      有符号(最高位为符号位,0为整数,1为负数)
                signed char         1个字节         -128~127
                signed short        2个字节         -32768~32767
                signed int          4个字节         正负20亿
                signed long         4/8个字节        
                signed long long    8个字节         正负9开头19位整数
            unsigned    无符号
                11010101
                unsigned char         1个字节         0~255
                unsigned short        2个字节         0~65535
                unsigned int          4个字节         0~40亿
                unsigned long         4/8个字节        
                unsigned long long    8个字节         0~1开头20位整数

                注意:singned不加就代表了加
                由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名
                需要导入头文件<stdint.h>
                        uint8_t uint16_t uint32_t uint64_t
                        int8_t  int16_t int32_t int64_t

浮点型:有小数部分的类型

  1. float 单精度浮点型 4个字节
  2. double 双精度浮点型 8个字节
  3. long double 12/16个字节(取决于操作系统位数)
    注意: 小数点后六位有效,采用一定得算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读取整形要慢得多,建议编程时尽量使用整型数据
    3.1415

模拟型:

  1. 字符型:char
    字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCII表中对应的关系显示出对应的字符或图案
    ‘\0’(字符) 0(整数值) 特殊字符
    ‘0’ 48
    ‘A’ 65
    ‘a’ 97
  2. 布尔型bool
    先有C语言后有的bool类型,所以C语言中不可能有真正的bool类型,在头文件stdbool.h对布尔类型进行了模拟
    bool true false

7.变量和常量

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

类型占位符: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   %f
        double %lf
        long double %LF
        字符型 char %c

int scanf(const char *format,…);
功能:输入数据
format:“双引号包含的占位符”
…: 变量地址列表
返回值:成功输入的变量的个数
注意: scanf需要提供变量的地址 &变量名 ==变量地址 &是取地址值符

什么是常量:程序运行期间数值不能改变的叫做常量
        100   默认int类型
        100l   long
        100ll  long long
        100u   unsigned int
        100llu unsigned long long
        3.14    默认double
        3.14f   float
        3.14l   long double

8.格式化输入和输出

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

9.运算符

1.自变运算符

  1. ++/-- 使变量的值自动加1或者减1
  2. 前自变:++num/–num 立即生效
  3. 后自变:num++/num-- 下一行语句才有效.
    注意:不要在一行代码中多次使用自变运算符

2. 算术运算符

+ - * / %
    整数/整数  结果还是整数,没有小数点,只保留整数部分
    10/3    ->3
    10%3    ->1
    / % 除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错(编译不糊出错,只有警告),一旦产生程序立即停止,后面不再执行

3.关系运算符

>   <   >=   ==      !=
    比较的结果有两个0(不成立)或1(成立),比较的结果可以继续参与后续的运算
    int n= -100;
    if(10<n<100)
    结果永远为真,与数学运算规则不同
    注意: ==建议常量放左边

4.逻辑运算符

&&   ||    ! 
    把运算对象转换成逻辑值,0转换为假,非零转换为真
    A && B  一假即假
    A || B  一真即是真
    !A      求反
    &&  || 短路特性:
        当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算

5.三目运算符

运算的对象有三个部分
    A ? B : C  
    判断A的值如果为真则执行B,否则执行C

6.赋值运算符

a = 10;
    a += 10;      a=a+10;
    a -= 10;
    a /=10;
    a %=10;

7.位运算符

&   |    ~   ^    <<   >>

10.分支语句

if(表达式)   //单分支
{
    //表达式为真(非0),则执行此处代码

}


if(表达式)   //双分支
{
    //表达式为真(非0),则执行此处代码

}
else
{
    //表达式为假(零),则执行此处代码

}

 
 if(表达式)   //多分支
{
    //表达式为真(非0),则执行此处代码

}
else if(表达式2)
{
    //表达式2为真(非0),则执行此处代码

}
else if(表达式3)
{
    //表达式3为真(非0),则执行此处代码
}
else
{
    //如果以上所有表达式都为假,则最后执行此处代码
}