初识C语言

初识C语言



前言

本文将简单介绍一下C语言的历史以及基本用法,如有遗漏请多包涵。


一、C语言的历史

C语言诞生于1970~1973年,丹尼斯.里奇和肯.汤普逊编写完成的,归属于美国的贝尔实验室
C语言专门为了编写操作系统而诞生的,因此天生适合对硬件编程,也非常适合数据结构和算法的实现,以速度快而著称
由于C语言出现时间早,有很多坑,毕竟开发者都是大佬,他们也没想到普通人也能用C语言,不过虽然存在陷阱,但是一些前辈帮你总结好了经验《C语言的陷阱与缺陷》
虽然C语言自由度很高,但是高自由度意味着高风险,所以要自律。

二、C语言基本用法

1.第一个C语言程序

一般来说第一个C语言程序都是输出Hello World!

代码如下:

#include <stdio.h>
int main()
{
	printf("Hello World!\n");
	return 0;
}

下面我将一步一步解析这几行代码:
#include <stdio.h>
程序员所写的代码并不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译程序叫做预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令,以#开头的都是预处理指令
#include 把头文件导入到当前文件
#include <> 从系统指定目录下查找头文件并导入
#include “” 先从当前目录下查找,如果找不到再从系统指定目录下查找并导入
stdio.h 负责对输入输出的函数进行说明

    .c  源文件  记录的都是功能性代码
    .h  头文件  绝大多数记录的是函数的说明

main函数:
函数是C语言管理代码的基本单位,一个函数就是一个功能的实现,就是一个代码段
main函数是程序的入口,也是唯一出口,有且只有一个

int 是一种数据类型,表示函数的返回值类型,是一个整数
printf/scanf 属于C标准库中的函数,输入、输出数据
转义字符:
键盘上一些没有的符号,通过一些特殊的字符来表示

        \n  换行符
        \b  退一个字符 
        \r  回到行首
        \a  铃响
        \t  制表符
        %%  一个%
        \\  一个\

C语言以分号作为一行代码的结束,使用大括号来划分代码

return 作用:
1、返回一个返回值给调用者
2、结束函数的执行
main函数的调用者是操作系统,它的返回值返回给操作系统,反映了程序的是怎么样结束的:

				正数    出现异常
                0       正常结束
                负数    出现错误

2.gcc编译器:

负责把人能看懂的代码的文本文件翻译成计算机能看懂的二进制文件
由预处理器、编译器、链接器组成
gcc是由GNU组织为了编译Linux内核而开发的一款免费的编译器
常用参数:

 -std=gnu99  设置编译语法标准 -std=c99
        -E      对文件只进行预处理操作,并显示结果
        -c      只编译不链接
        -o      指定输出的结果名
        -S      对文件进行汇编操作
        -I      指定头文件的查找路径
        -l      使用指定的代码库 -lm  math.h
        -Wall   尽可能多地产生警告
        -Werror 把警告当做错误处理

C语言代码变成可执行程序的过程:
    预处理:    把源文件翻译成预处理文件
        gcc -E code.c                       把源文件预处理后的结果显示屏幕上
        gcc -E code.c -o code.i     ->code.i 生成以.i结尾的预处理文件
    编译:      把预处理文件翻译成汇编文件
        gcc -S code.i               ->code.s 生成以.s结尾的汇编文件
    汇编:      把汇编文件翻译成目标文件 (二进制)
        gcc -c code.s               ->code.o 生成以.o结尾的目标文件
    链接:      把若干个目标文件合并成一个可执行文件    a.out
        gcc a.o b.o c.o...          ->a.out 生成a.out可执行文件

C文件类型:

.c  源文件
.h  头文件
.h.gch  头文件的编译结果
.i  预处理文件
.s  汇编文件
.o  目标文件
.a  静态库文件
.so 共享库文件

3.数据类型

存储空间的单位:

Bit     比特 存储一个二进制位,只能存0或1,计算机存储数据的最小单位
Byte    字节 八个二进制位,计算机存储数据的基本单位
Kb      1Kb=1024Byte
Mb      1Mb=1024Kb
Gb      =1024Mb
Tb      =1024Gb
Pb      =1024Tb
为什么要对数据进行分类?
    1、在自然界中数据本来就是分类的
    2、对数据进行分类可以节约空间,提高运行效率

C语言中把数据分为自建(程序员自己设计的类型,例如结构、联合、类)、内建(C语言自带的)

整型:

        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位数

            注意: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        0~以1开头的20位整数

            注意:
                由于定义无符号的数据比较麻烦,标准库中有头文件<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 字符型:%c %hhd
所谓的字符就是符号或图案,在内存中是以整数形式存储的,需要显示字符时,会根据ASCII码表中的对应关系来显示出对应的符号或图案
            0   '\0'    特殊字符
            48  '0'
            65  'A'
            97  'a'

bool 布尔型:

先有的C语言才发明的bool类型,所以C语言没有真正的布尔类型,必须加上头文件<stdbool.h>才能使用
bool   true 1     false 0

sizeof(unsigned int) 计算类型、变量所占的字节数

4.变量和常量:

什么是变量:

    相当于存储数据的盒子,在程序运行期间数值可以发生改变
定义:
    类型 变量名;
    int num;
    变量名的取名规则:
        1、由字母、数字、下划线组成
        2、不能以数字开头
        3、不能与32个关键字重名 printf scanf sizeof bool
        4、见名知意(功能、类型、范围)
    注意:变量的值是随机的,为了安全起见,一般初始化为0 
    int num = 0;

使用:
    赋值:  num = 10;
    参与运算 num*10

变量的输入输出:

    int printf(const char *format, ...);
    功能:输出数据
    format:"双引号包含的提示信息+占位符"
    ...:    变量列表
    返回值: 输出字符的个数
    int scanf(const char *format, ...);
    功能:输入数据
    format:"双引号包含的占位符"
    ...: 变量地址列表   变量的地址 = &变量名
    返回值:成功输入的数据的个数
    类型占位符:
        %hhd %hd %d %ld %lld
        %hhu %hu %u %lu %llu
        %f %lf %LF
        %c

什么是常量:

    程序运行期间数值不能发生改变的叫常量
    100 默认int
    100l long
    100ll long long
    100u unsigned int
    100lu   unsigned long
    100llu
    
    3.14 默认double
    3.14f  float

格式化的输出:

%nd     显示n个字符宽度,不足则补空格,右对齐
%-nd    显示n个字符宽度,不足则补空格,左对齐
%0nd    显示n个字符宽度,不足则补0,右对齐
%n.mf   显示n个字符宽度,不足补空格,m表示小数点后的位数
%g      不显示小数点后多余的0

5.运算符:

自变运算符: ++/-- 使变量的值自动加1或减1

    前自变:立即有效
    后自变:下一句语句才有效
    注意:不要在一行代码内多次使用自变运算符

算术运算符: + - * / %

    整除/整数 结果不能有小数点 10/3 3
    / % 除数不能为0,否则产生 浮点数例外,核心已转储的报错信息
    一旦除零,程序直接死掉

关系运算符: > < >= <= == !=

    运行后,得到的是比较的结果 1或者0,比较的结果是可以继续参与运算
    int n=-100;
    10<n<100; C语言中永远为真,规则跟数学中的不一样
    if(100 == n)
    {

    }

逻辑运算符: && || !

    会把运算对象转换为逻辑值,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、整型向浮点型转

强制类型转换:
    (新类型)数据 有丢失数据的风险,谨慎使用

6.分支语句

if

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

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

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

switch开关语句

switch(n)   //n可以是数值、变量、表达式,运算结果必须是整数
{
    case val://val必须是整常量,如果val等于n,则打开开关,执行后面语句
        ...
            break;// break 可以关闭开关,如果每个语句后面都加上break
                  // switch语句不能与continue配合使用
    default:    // 当所有case都没有匹配成功时则打开此处开关,无论放在哪里,都会最后执行
}

7.循环语句

for循环语句

循环就是让一段代码反复执行,达到你想要的效果,for是一种比较灵活且比较危险(与其他循环相比)的循环,一般使用一个变量来引导for循环的运行,这个变量叫做循环变量 i

 for([1];[2];[3])
    {
        [4];
    }

1、给循环变量赋值,C99标准才可以在for内定义循环变量 -std=gnu99
for内定义的循环变量,只能在for循环内使用
2、判断循环变量是否到达边界,判断为真时执行4,为假结束循环
4、被反复执行的代码,也叫做循环体
3、改变循环变量,防止出现死循环,一般是对循环变量自加或自减
1 2 4 3 2 4 3 2…

大括号:
1、建议上下对齐
2、循环体如果只有一行代码,大括号可以省略
但是不利于代码的扩展,一般的商业代码要求大括号不能省略

 //for的多种写法:
    for(;;)
    {
        //死循环
    }

    int i=0;
    for(; i<10; i++)
    {

    }

    for(int i=0; i<10;)
    {
        printf("---\n");
        i++;
    }

while语句:

while(条件) //当条件为真时,执行循环体,否则结束循环
{
    //循环体
}

while相当于for循环的精简版本 for(;条件;)
for循环负责明确知道循环次数的问题
while负责解决只知道结束条件而不确定循环次数的问题

do while
    do{
       //循环体 
    }while(条件);       注意:分号不能少

先执行循环体,在判断循环条件,该循环至少执行一次
适合先干活,再判断的特殊情况

8.循环嵌套

循环语句中包含循环语句
外层循环执行一次,内存循环执行n次

跳转语句:

goto

函数内任意跳转

标签名:
    goto 标签名; 

goto可能会破坏已经设计好的分支或循环语句,因此绝大多数公司禁止使用
在驱动编程时特别适合处理异常

break

1、在switch语句中,可以关闭执行开关
2、在循环语句中,可以跳出一层循环

continue

结束本次循环,直接进入下一次循环

return

1、返回一个数据给函数的调用者
2、结束函数的执行,跳转到调用该函数的位置

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值