C 语言学习笔记(1)

内容提要

  • C语言概述
  • 数据类型
  • 常量

C语言概述

计算机基础

计算机的组成
计算机组成
  • 计算机:能进行计算机以及逻辑处理的设备

  • 硬件:组成计算机的物理部件(内存条、CPU、硬盘…)

    开发中对于硬件的认知:

    ​ 硬件包括电子设备、单片机、集成电路和嵌入式系统

  • 软件:计算机运行的程序和数据

    开发中对于软件的认知:

    ​ 软件分为系统软件(OS)、应用软件和编程工作(编译器)

计算机的六大部件
  • 中间处理器(CPU):控制+计算
  • 内存:临时存储运行的数据
  • 输入设备:向计算机输入数据(键盘、鼠标、扫码枪)
  • 输出设备:将计算机数据进行输出(显示器、打印机)
  • 外存储器:永久存储数据(硬盘)
  • 网络:数据传输与通信
计算机的工作原理
  • 存储程序:程序和数据存储在内存中
  • 程序控制:CPU按指令顺序执行
计算机的语法
  • 机器语言:二进制代码,直接控制硬件
  • 汇编语言:助记符形式,需要汇编器翻译
  • 高级语言:C/C++,java,Python,PHP,C#,GO

C 语言简史与特点

C 语言的起源

在这里插入图片描述

  • 其前身是B语言;
  • B语言是美国贝尔实验室的 Ken Thompson(肯·汤普森)于1969年开发出来的,并且用B语言编 写了初版的UNIX系统
  • 1972年美国贝尔实验室的Dennis Ritchie(丹尼斯·M·里奇)在B语言基础上开发的C语言.C语言 提供了丰富的数据类型和标识符,使得程序的编写变得非常高效和方便。
  • 1973年初,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了UNIX。
C 语言的标准

为了C语言健康发展下去,很多有识之士及美国国家标准协会(ANSI)于1982年成立了一个委员会 以确定C语言的标准。

  • 1989 ANSI 发布了第一个完整的C语言标准,即C89。不过人们习惯性的称为 “ANSI C”
  • 1990年ISO(国际标准化组织一字不改的采纳了 C89,官方给出的名称为 ISO C90) 。
  • 1999年,C语言标准经过了一次修正和完善后,ISO发布了新版的C语言标准,简称” C99”。
  • 2018年6月份发布的 “C18”GNU C 标准 (标准C的扩展) ,进一步增强了语言的稳定性和功能性。
  • 在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。 “C23”是最新的标准,预计将进一步扩展C语言的功能和性能。
  • 应用于Linux 系统,当然Linux也支持标准C,因为标准C是跨平台的。

嵌入式开发就是针对Linux系统的开发,而Linux系统是使用C语言开发的,所以从事嵌入式开发要使用C语言。

C 语言特点
  • 简洁高效,支持底层硬件操作
  • 可移植性强,适合结构化编程
  • 生成代码质量高,执行速度

C语言程序的开发过程(重点)

开发的三个步骤

1.编辑:编写源代码(.c文件,程序员完成)

2.编译:将源代码文件转换为可执行文件(编译器完成)

3.运行:执行程序(操作系统加载)

在这里插入图片描述

C语言程序的编译过程

注意:本章节只是做一个简单地概念了解,后续章节详细展开

上面提到的编译,实际上是分为了四个步骤:

1.预处理:处理宏和头文件以及注释等

2.编译:生成汇编语言

3.汇编:转换为机器码/二进制代码(.o文件)

4.链接:合并库文件和目标文件

在这里插入图片描述

测试代码:

#include <stdio.h>
 
#define PI 3.14

int main()
{

    printf("hello world!");
 
    double area = PI * 2 * 2;
    
    return 0;
 }

编译的命令

编译步骤命令文件类型说明
预处理gcc -E *.c -o *.i*.c → *.i生成的是c代码(文本)
编译gcc -S *.c -o *.s*.c → *.s生成的是汇编代码(文本)
汇编gcc -C *.c -o *.o*.c → *.o生成的是二进制代码(文本)
链接gcc *.c -o *生成的是二进制代码(文本)

C语言的基本结构

一个简单的C语言程序

功能:要求在控制台输出“hello world!”

代码:

#include <stdio.h>
#define PI 3.1445
int main()
{
    printf("hello world!");
    double area = PI * 2 * 2;
    return 0;
}

在这里插入图片描述

程序结构分析:

注释:解释代码逻辑,写给程序员自己看,预处理阶段会被删除;

预处理指令:程序中包含的某一文件内容(#include<stdio.h>);

主函数:main函数是程序唯一的入口,有一个文件中最多有1个,这个函数不能被其他函数调用,这是一个自动执行函数,系统是通过这个函数的指针进行访问的。

关于函数:

函数头:(函数首部或者函数说明)

说明函数类型,函数头由函数名函数参数构成。

在这里插入图片描述

函数体:

包含变量说明语句说明部分。

在这里插入图片描述

函数调用语句:比如prirntf( )

在这里插入图片描述

C语言编程规范要求

C语言在编程的时候,需要遵循如下规范:

  • 常用的缩进格式(一般缩进2~4个字符,推荐缩进4个字符,也就是Tab键,vim默认是缩进8个字符)

  • 需要足够的注释(添加必要的注释,使用代码更好理解)

  • 有合适的空行(一般处理命令和函数之间,函数和函数之间,全局变量和函数之间…,加空行提高打麻可读性,使代码结构更清晰)

  • { }:对齐(C和C++中{}都需要独占一行,千万不要受java影响)

    java

    int fun(){
         ...
     }
    

    C/C++

    int fun()
    {
     ... 
    }
    

    函数体内采用分层缩进和模块化书写

    int fun()
    {
        if(..)
         {
              for(..)
              {
                  printf("hello\n");
              }
         }
         if(..)
         {
              for(..)
              {
                  printf("hello\n");
              }
         }
    }
    

    不把多条语句写在程序的同一行上(最好的区分就是,不要在同一行出现连个以上的分号;for循环(;;)除外)

    int main()
    {
         // 错误写法
         printf("hello"); printf("hello"); printf("hello");  
        
        // 错误写法
         int a = 10; int b = 20;
         
        // 错误写法
         for (..) {}
     }
    

    标识符命名要见名知义

     int main()
     {
         // 创建三个变量,用来来存储年龄、身高、体重
         // 错误演示:
         int a = 21;
         int b = 168;
         int c = 190;
        
         // 正确演示:
         int age = 21;
         int height = 168;
         int weight = 190;
     }
    

C语言程序的设计特点

C语言程序设计的时候,需要注意以下细节:

  • C程序有一个或多个函数组成,但有且仅有一个main函数,这个函数是程序的入口函数,可以置于程序的任意位置,建议放在所有函数的最下面

  • 程序中可以有预处理指令(如:#include、#define),预处理指令通常放在程序的最前面。

  • 每个语句以分号结尾:(预处理指令函数头函数、分支、循环后的花括号,后面不能添加分号,否则回报错)

  • 函数体由一队{}括起来,{}是不能省略的

  • 包含在/*../内,或者//..后面的文本为注释内容,在预处理阶段删除。

  • 一行可以写多个语句,一个语句可以写在多行上

    int main()
    {
          // 一行写多个语句
          int a,b,c;
          // 一个语句写在多行
          while(1)
          {
              ...
          }
    }
     // 格式化笔记中代码:shift + tab
    

C语言中的注释

在C语言中,注释一般分为两类:单行注释多行注释

注释的作用:给代码添加解释说明性文字,提升代码的可读性,注释本身不参与编译,在处理阶段会被删除。我们同时也可以使用注释屏蔽掉暂不需要的代码。

单行注释

说明:单行注释使用双斜杠//..表示。我们一般用于变量、常量、函数调用语句等

语法:

//需要注释的内容

范例:

//预处理指令,引入系统标准输入输出库
#include <stdio.h>

int main()
{
    //向控制台打印输出 hello world
    printf("hello world!\n");
    
    return 0;
}
多行注释

说明:多行注释使用斜杠星花/*..*/ 表示。 它可以占用多行,但不能嵌套。我们一般用于函数,文件头说明等。

语法:

/*要注释的内容*/

/*
  要注释
  的内容
*/

范例:

/*
     主函数
*/
int main()
{
    ....   
}

注意:有多行注释衍生出一种更为细致的注释,我们称之为文档注释

范例:

/**
 *主函数
 *@author 开发者
 *@param  参数1 说明
 *@param  参数2 说明
 *@return 返回值
*/
int main()
{
    ...
}

数据类型

定义

数据类型其实就是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。简单来说,就是组织和操作数据。

数据:计算机要处理的数据(数字、字符串、文字符号、图片、音频、视频等)

  • 数据类型不仅帮护我们组织和操作数据,还决定了程序如何有效的利用内存。

  • 了解数据类型的内存需求是理解计算机管理和操作数据的关键

    小贴士:程序运行需要在内存中

数据类型分类和计算方法

数据类型分类(重点)
  • 基本类型(C语言内置)
    • 数值类型
      • 整型(整数)
        • 短整型:short(short int 缩写)
        • 基本型:int(使用最多)
        • 长整型:long(long int 缩写)
        • 长长整型:long long(long long int 缩写,这是C99新增的)
      • 浮点型(小数、实数)
        • 单精度型:float
        • 双精度型:double
        • 长双精度型:long double(C99新增)
    • 字符型:char
  • 构造类型(用户自己定义)
    • 结构体:struct
    • 联合体/共用体:union
    • 枚举类型:enum
  • 指针类型
  • 空类型:void(C语言内置)
数据类型在内存中的大小(重点)
序号数据类型中文说明大小(字节)
1short(short int)短整型2
2int基本整型4
3long(long int)长整型4(32位系统)/8(64位操作系统中
4long long(long long int ,C99新增)长长整型8
5float单精度浮点型4
6double双精度浮点型8
7char字符型1
8bool(Bool,C99新增)布尔型,true-真,false-假bool:1,true(1):4,false(0):4

在这里插入图片描述

注意:truefalse是宏定义,实际是10

注意:因为C语言没有Byte这个单位,所以一般使用char来表示字节。因为1char=1byte

小贴士:

获取某个数据类型或者变量所占的字节数,使用sizeof运算符:sizeof(某个数据类型或者变量名

printf ("true size:%d\n",sizeof(trrue));//true size:4   解释:true本身就是int类型的1,所以占4个字节
printf ("bool size:%d\n",sizeof(bool));//bool size:1    解释:占一个字节

总结:

①数据类型在内存中所占的字节数跟C语言的编译系统有关。

②计算某个数据类型所占字节数可以用sizeof运算符。

③布尔类型要添加#include <stdio.h>,也可以直接使用int类型的0和1来表示布尔类型。

常量

在C语言中,数据的基本表现形式是常量变量,不管是常量还是变量,都是需要在内存中申请一块空间,用于数据的存放。

定义:在程序执行过程中其值不能被改变的量。

分类:int、float、double、char、符号常量(宏定义)

整型常量

整型常量可以用十进制、八进制、十六进制三种形式表示。

  • 十进制常量:由数字0~9的数字构成,没有前缀,不能以0开头。

举例:

99,218   //正确
0        //正确
09       //错误的,不能以0开头
  • 八进制常量:由数字0~7构成,以0为前缀,不能表示小数。

举例:

023,077   //正确
00        //正确
099       //错误的,数字是0~7
  • 十六进制常量:由数字0~9,字母a-fA-F构成,以0x|0X为前缀,不能表示小数。

举例:

0xff000       //正确
0x55          //正确
0x0           //正确
  • 整型常量:长整型数据可用L或者l作为后缀

举例:

long num = 123L;
  • 整型常量的分类
    • 有符号与无符号基本整型常量
      • 有符号表示范围:负数+0+正数
      • 无符号表示范围:0+正数,内存中所有的负数位置都可以用来表示正数,此时它的正数范围超过有符号数正数范围。
    • 有符号与无符号长整型常量(long)
    • 有符号与无符号短整型常量(short)
  • 整型常量的表示
    • 十进制表示:可以使用10个数字符号0~9以及+,-,如:123,-90
    • 八进制表示:以0开头,可以使用7个数字符号0~7以及+,-,如:0123,-011
    • 十六进制表示:以0x或者0X开头,可以使用 0~9 以及 A~F(a~f) ,如:0x12,-0x12

浮点型常量

C语言中浮点型数就是平常所说的小数(实数),有两种表现形式:

  • 十进制小数:如:0.123,-12.6,0.123F(F表示float)

  • 指数形式(科学计数法)

    • 如十进制小数1234.5的指数表示法就是 1.2345 ∗ 1 0 3 1.2345 * 10^3 1.2345103,也可以表示为 1.2345 e 3 1.2345e3 1.2345e3
    • 如十进制小数0.012的指数表示法就是 1.2 ∗ 1 0 − 2 1.2 * 10^{-2} 1.2102,也可以表示为 1.2 e − 2 1.2e-2 1.2e2

    注意:

    ①在符号e前面必须要有数字

    ②在符号e后面必须为整数,不能是带小数点的实数型。

    ③实型常量的后缀应用F/f表示单精度型,后缀用L/l表示双精度型。

字符型常量

用单引号''括起来的一个字符,如a,A,4,-等,比如:就不是字符,一个汉字所占的字节数都超过1个字符。中文符号当成汉字理解。英文输入法下的字母、数字、符号都是单字符

转义字符常量:以反斜杠\开头的字符序列,表示控制以及不可见字符。如:

字符形式中文含义ASCII码
\n换行10
\r回车13
\0空字符0
\t水平制表符9

字符串常量

说明:在C语言中,支持字符串常量,不支持字符串变量。字符串变量需要使用字符数组或者字符指针实现

  • 用一对双引号""括起来的一个字符序列,如:

    "How do you do?"
    "yueqian"
    "12"
    "true"
    "12.25"
    
  • 可以用使用printf输出一个字符序列,如:

    printf("%s","hello world!\n");
    printf("hello world!\n");     //等价于上面写法
    

注意:

字符常量a与字符串常量a的区别:

在这里插入图片描述

系统自动为字符串常量加上结尾的\0,使所占的内存单元多一个,单字符常量的长度不变,可以用sizeof()运算符来测量。

符号常量

说明:一般通过宏定义,在预处理的时候替换成具体的常量

定义一个标识符来代表一个常量。如:用PI代表圆周率π(3.1415926)

好处:

  • 增加可读性
  • 增强了可维护性

定义符号常量:

  • 用预处理指令:#define

  • 格式:

    #define 标识符 字符串 
    
    • 标识符和字符串之间用空格隔开

    • 句末不加分号

    • 标识符的命名采用大写,如果有多个单词,使用下划线分割,举例

      MAX_VAL
      MIN_VAL
      

范例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值