C语言学习

C语言简介

BCPL -> new B -> C语言 -> UNIX -> Minix -> Linux -> gcc
C语言诞生于1970-1973年,在肯·汤普逊丹尼斯·里奇的编写下完成,归属于美国贝尔实验室
C语言之父:丹尼斯·里奇(也有称 肯·汤普逊丹尼斯·里奇同为C语言之父)

C语言优点:

1.C语言专门用于编写操作系统而发明的编程语言,所以天生适合硬件编程
2.以运行速度快而著称,
3.非常适合实现数据结构和算法

C语言缺点:

1.由于出现的时间过早,有很多缺陷,也存在着很多的陷阱
我们的前辈给总结了一些避免陷阱的经验教训   
(《C陷阱与缺陷》《C和指针》《C专家编程》)-> (C语言三剑客)
2.C语言的语法很自由,但是也意味着危险

自由源于自律

C语法标准

C89语法标准		默认是gcc编译器的语法标准
C99语法标准		可以认为是对C语言的扩展和增强
    		Ubuntu 16.04 默认C99  
    		-std=gnu99  指定为C99语法标准
C11语法标准		全新的升级

一、第一个C语言程序

1、vim xxx.c    创建.c源文件
2、编写代码,并保存退出
3、gcc xxx.c    编译.c源文件,成功会得到a.out可执行文件
4、./a.out  运行可执行文件
    注意:可以合并3、4步骤
        gcc xxx.c && ./a.out

#include <stdio.h>
程序员所编写的代码不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译的程序叫做预处理器翻译的过程叫做预处理需要被翻译的代码叫做预处理指令以#开头的代码叫做预处理指令
#include 功能是导入头文件
#include <xxx.h>
<> 从系统指定路径查找头文件并导入
#include "xxx.h"
"" 先从当前的工作路径查找头文件,如果找不到再从系统指定路径查找并导入
stdio.h
头文件:以.h结尾,里面存放的是辅助性的代码,绝大数都是函数的说明

int main()
{
    printf("Hello World!\n");   
    return 0;
}

main函数:入口函数
C语言以函数为单位来管理代码,一个函数就是一段具有某一项功能的代码段
main函数是程序的执行入口,必须有且只能有一个
int 是一种数据类型,它表示main函数的执行结果是一个整数
return 功能有两个:

1、结束函数的执行
2、返回一个结果给函数的调用者

main函数的调用者是操作系统,它的返回值是给了操作系统的,它的值能反映出程序是如何结束的,一般有三类:

正数    出现异常    (别人的错误)
0       一切正常
负数    出现错误    (自己的错误)

printf/scanf 是标准库中的函数,负责输出数据、输入数据
printf("想要输入的内容");

转义字符:

键盘上一些无法直接打印显示的符,用一些特殊的字符组合来表示,这种特殊的字符组合成为转义字符,\n 就是其中之一

\r  	回到行首
\t  	制表符,相当于Tab,用于输出格式对齐
\b  	退格键
\a  	铃响
\\  	表示一个\
%%  	表示一个%

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

二、编译器

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

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

三、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的可执行文件              

四、C语言的文件类型

.c      源文件
.h      头文件  
.h.gch  头文件的编译结果文件,它会被优先使用
.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      有符号  
     11010111    最高位表示符号位    0为正,1为负
     signed char             1个字节                                                 -128~127
     signed short            2个字节                                                 -32768~32767
     signed int              4个字节                                                 ±20亿
     signed long             4/8个字节   操作系统32位为4个字节,操作系统64位为8个字节   ±20亿/±9开头的19位整数
     signed long long        8个字节                                                 ±9开头的19位整数
unsigned    无符号  从0开始,最小是0
     11010101    最高位是数据位
      unsigned char           1个字节                                                 0~255
      unsigned short          2个字节                                                 0~65535
      unsigned int            4个字节                                                 0~40亿
      unsigned long           4/8个字节   操作系统32位为4个字节,操作系统64位为8个字节    0~40亿/0~1开头的20位整数
      unsigned long long      8个字节                                                 0~1开头的20位整数
注意:signed不加就代表了加
由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名:
                需要导入头文件<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个字节
注意:小数点后六位有效
注意:采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读取整型要慢得多,编程时尽量使用整型数据

判断double是否与0相等?

double num
if(num < 0.000001 && num > -0.000001)

模拟型:

字符型:char
字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCII表中对应的关系显示出对应的字符或图案
'\0'    0       特殊字符 空字符
'0'     48      (单引号中只能放一个字符)
'A'     65
'a'     97

布尔型:bool

先有的C语言后有的bool,所以C语言中不可能有真正的布尔类型,在头文件stdbool.h中对布尔类型进行了模拟
添加头文件<stdbool.h>后才可使用 bool true false

类型转换

只有相同类型的数据才能运算,如果类型不相同的数据需要先转换后才能再进行计算。

自动类型转换:

转换规则:以不丢失数据为基础,可以适当地牺牲一些空间

1、字节少的向字节多的转   (优先级最高)
2、有符号的向无符号的转
3、整型会向浮点型转
注意:char short 如果与不同类型的数据运算时,会先提升为int类型后参与运算
强制类型转换:

(新类型名)数据;
这种方式有可能会丢失数据,慎重使用

七、变量与常量

什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个存储数据的盒子
定义: 类型名 变量名;
int num;
取名规则:

1、由字母、数字、下划线_组成
2、不能以数字开头
3、不能与C语言32个关键字重名(要求能默写)
4、见名知意 (功能、类型、作用范围...)
        int sum_s_i;

使用:

赋值:       变量名 = 10;
            num = 10;
参与运算:   2+(变量名*10);
           2+(num*10);   
注意:C语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0

变量的输出与输入:

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
100lu   unsigned long
100llu  unsigned long long
3.14    默认double
3.14f   float
3.14l   long double

八、格式化输入输出

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

九、运算符

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

算术运算符: + - * / %
    整数/整数   结果还是整数,没有小数点,只保留整数部分
      10/3    ->  3
      10%3    ->  1
	 / % 除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错,一旦产生则程序立即停止   ->  计算机中只有加法器,无法完成该操作

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

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

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

赋值运算符:
    a = 10;
    a += 10;    a=a+10;
    a -= 10;
    a *= 10;
    a /= 10;
    a %= 10;

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

十、分支语句

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

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

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



switch开关分支语句
switch(n) // n可以是数值、表达式,表达式的运算结果必须是整数
{
    case val:   // 如果val == n,则打开执行开关
                // val必须是常量
        ...
        break;  // 关闭执行开关,结束switch
        // 如果每个case后都加break,形成了分支结构
        // switch中不能使用continue配合
        // case a ... b:可以表示[a,b],但是只有GNU编译器才支持该语法,不建议使用
    case val1:
        ...
    default:
        // 如果所有的case都没有打开,则最后打开default,并且放在任何位置都可以最后打开
}

十一、for循环语句:

循环就是一种让代码反复执行的一种方法,直到达到你想要的效果
for循环是一种非常灵活变化多样且危险(相比其他循环)的循环

for一般使用一个变量来引导循环的执行,该变量叫做循环变量i    index
for([1];[2];[3])
{
    [4];
}
[1]、给循环变量赋初值,C99以上标准才可以在此处定义循环变量 -std=gnu99
[2]、判断循环变量是否到达边界,如果没到达,进入循环
[4]、被反复执行的代码,成为循环体
[3]、改变循环变量,防止出现死循环,一般对循环变量进行自加、自减
执行顺序:[1][2][4][3][2][4][3]...

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

for循环各种写法:

1.
  for(;;)
  {
      //  死循环
  }


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

  }


3.
  for(int i=0; ; i++)
  {
      if(i >= 10)
      {
          break;
      }
  }

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

十二、while循环语句

while(表达式)
{
    //  循环体
}

当表达式为真时执行循环体,执行完后重新判断表达式,以此类推,直到表达式为假,结束循环
while相当于for的精简版本    for(;表达式;)

for循环专门负责解决明确知道循环次数的问题
while循环专门负责解决不确定循环次数的问题

十三、do-while 循环语句

do{
    //  循环体
}while(表达式); 	//表达式为真循环继续,为假结束循环
先执行循环体,再判断循环条件,该循环体至少执行一次   

适合先干活、后检查的特殊情况,例如输入密码、文件内容判断

十四、循环嵌套

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章: C语言概论 C语言的发展过程   C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。 当代最优秀的程序设计语言   早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。 C语言的特点   C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。 C语言版本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值