C语言基础

英文:

read:读,r字母
write:写,w字母加粗样式
execute:执行,运行,x字母
directory:目录,d字母
英语:
q:quit 退出
w:write 写,保存
n:next
std:standard:标准
h:head:头部
include:包含,包括
main:主要的,最重要的,入口
print:打印
format:格式
printf=print format=按照一定的格式进行打印输出
return:返回,结束
i:input:输入
o:output:输出
B:Byte 字节
Address 地址
Buffer: 存储区
base address 首地址
英语
variable:变量,var
char:字符,例如:‘a’,'A’等
B:Byte:字节,1字节
W:Word:字,4字节
H:Half:一半
HW:HalfWord:半字,2字节
DW:DoubleWord:双字,8字节
rollback: 回滚 ,从哪里来滚回哪里去,例如 0,1,2,3,4,5,6,7,8,9
type:类型
circle:圆
rectangle:矩形
ellipse:椭圆
radius:半径
英文缩写
Bin:二进制
Oct:八进制
Dec:十进制
Hex:十六进制
add:加
sub:减
mul:乘
div:除
core dumped 核心已转储:表示程序崩溃了
hour:小时
minute:分钟
second:秒
warning: format ‘%d:占位符用的不对!
operation : 操作
inc = increase : 自增
dec = decrease :自减
rel = relationshiop 关系
logic: 逻辑
shift: 位移
abs: absolute: 绝对
rel: retative: 相对
priority: 优先级
英语
if:如果
else:否则
break:中断,结束
continue:继续
salary:薪资
min: 最小
max:最大
type:类型
switch:开关
case:在这种情况下
break :中断,结束
default:默认的,没办法的
integer:整数
duplicate:重复了
previously:前面
undeclared:未声明,未定义
while:直到…为止
label:标签
ret:return:返回值
free:自由,释放
err:error:错误
overflow:溢出,装不下了
arr:array:数组
segment falult:已放弃 (核心已转储):程序崩溃了,因为内存非法访问崩溃,内存越界访问了
len:lenght:长度
英语
void:没有,空
extern:外部的,在外面可以使用
function:函数,功能
implicit declaration of function ‘print:print函数没有声明 ,问题原因是要不函数名写错了,要不就是没有添加对应的头文件
exit:出口,退出,结束
overflow:溢出,越界,装不下了
swap:交换
change:改变
g:global:全局 全局变量名要求以g_开头
static:静态
dynamic:动态
pointer:指针



第一课: 计算机组成部分:硬件和软件

  1. 硬件部分: 细分两类
    必要的三大硬件

    1. CPU
      核心的两大功能:

    2. 数据运算,例如:1+1=2

    3. 控制外设:例如:cpu从键盘上捕获一个输入的字母,数字,然后cpu将捕获的信息放在显示器上显示出来
      从外设拿到数据(读数据,read)或者向外设发送数据(写数据,write)
      :何为外设?
      :除了CPU其他任何硬件

  2. 了解主流的cpu
    X86 : intel ,AMD
    PowerPC: 飞思卡尔,通信产品
    EPGA:xilinux ,各行各业
    DSP:TI(德州仪器) 各行各业
    ARM: (华为海思,高通),手机行业

  3. 内存(RAM):用于暂存CPU计算时(1)或者计算之后的数据(2)
    特点:数据可以进行无限的覆盖
    缺点:掉电数据丢失(就是重启或者断电)
    优点:数据的读或者写速度非常快(比CPU慢,比硬盘快)
    问:何为cpu访问控制操作内存呢?到底啥意思呢?
    答: 就是cpu从内存存读数据,例如:读取1,1 还有就是cpu向内存写入数据,例如:写入2

  4. 硬盘(ROM)(统称为闪存):用于永久性保存数据
    特点:数据也可进行无限的覆盖
    缺点:数据的读或者写操作太慢了,所以数据操作一般都要先从硬盘拷贝到内存
    再从内存进行操作,这样速度能够提高不少
    优点:数据永久性不丢失,也就是掉电数据不丢失

    2)其余可选外设
    外设:外接的硬件设备 例如:鼠标,键盘,显示器,显卡, WIFI, 触摸屏,内存,U盘等
    功能:1. 给cpu提供数据

  5. 存储数据:内存,闪存,U盘,TF卡等
    注意: 哪些外设需要有,哪些外设不需要,都是根据用户的需求来定

  6. 软件:细分三大类
    软件部分:细分三类

    1. 操作系统(类似大管家)
      功能:操作硬件(由操作系统中的驱动程序这类软件完成),给程序(QQ, 360等)分配CPU资源和内存资源
      明确:任何程序要想得到运行,必须先有CPU资源,只有CPU资源,才能数据运算,程序才算真正的运行明确:任何程序都是运行在内存中,所以后续计算机软件编程最终的目标就是怎么玩内存!

    2. shel1终端程序:(类似二管家,例如: windows下的黑窗口程序)
      功能:接收用户从键盘上输入的各种命令,然后执行这些命令,完成一定的功能
      例如:输入notepad命令,立马启动一个记事本程序

    3. 各种应用程序:QQ,吃鸡,抖音 ,百度浏览器等

  7. 主流的操作系统
    windows:微软
    linux:开源(免费和付费),推荐三大主流linux系统:
    ubuntu(推荐,64位,版本:18.04 ),fedora,kali(黑客最爱)
    苹果:MAC IOS
    安卓:本质就是linux 谷歌公司的
    vxwork:付费(硬实时操作系统,以上linux,windows等都是软实时操作系统)

  8. linux系统发展(设计思想参考unix)
    开源免费
    1991年正式发布
    linux内核之父:linus
    推荐linux发展视频:<>


  9. linux系统理念(信仰)[关键]
    五个字:一切皆文件
    含义:在linux系统中,所有的硬件外设(键盘,鼠标等)都是以文件的形式存在
    所以在linux系统中,如果应用程序(例如QQ等)要想访问某个硬件外设
    只需访闸这个硬件外设对应的文件即可,访问这个文件就是访问硬件外设本身!
    例如

硬件外设 对应的文件名
键盘 event0
鼠标 mouse0
显示器 fb0
触摸屏 event1
摄像头 video0
所以:QQ要从键盘读取数字:read(event0)

问:linux系统中文件如何管理呢?
:靠文件系统(仅仅是一个名词)来管理文件
不同的文件系统管理文件的方式方法不一样
例如:硬盘一般用NTFS文件系统一(管理的文件大小无限制)
U盘一般用FAT32文件系统(管理的单个文件不要超过4GB)
内存一般用SYSFS文件系统(管理的文件都是位于内存中,掉电丢失)

  1. linux系统中跟文件和目录(也是一种特殊的文件,俗称文件夹)相关的概念
    1. 目录:能够包含其他目录和文件

    2. 根目录:文件系统中最上一层的目录,用"/“表示
      也就是linux系统中所有的目录和文件他们都是位于”/"根目录下
      例如:/home(语义:在根目录下有一个home目录或者一个home文件)

    3. 子目录:位于其他目录下的目录
      例如:/home(语义:假如home是一个目录名,home就是根目录’/‘的子目录)
      /home/tarena:假如tarena是一个目录名,tarena就是home子目录
      其中第二个’/'表示分割

    4. 父目录:子目录的上一层目录
      例如:/home:根目录‘/’就是home子目录的父目录

    5. 当前目录(又称工作目录):当前正在使用或者所在的目录,用’.'表示
      例如:./home:当前目录下有一个home目录或者文件
      上一级目录:当前目录的父目录,用"…"表示
      例如:…/…/:上一级的上一级目录

    6. 主目录:登录linux系统时,需要一个用户,linux系统给这个用户专门指定了一个专有的目录
      此目录简称主目录,并且都是位于/home/目录下,用"~"表示
      例如:登录linux系统的用户名叫tarena,tarena用户的主目录:/home/tarena
      登录linux系统的用户名叫zhangsan,zhangsan用户的主目录:/home/zhangsan

    7. 路径:目录和文件的位置,又分两种:
      绝对路径:以"/“开头的路径表示形式
      例如:/home/tarena
      相对路径:不以”/“开头的路径表示形式
      例如:home/tarena或者./home/tarena或者…/…/
      由衷建议:以后软件代码中最好写绝对路径
      open(“my.txt”); //前提是程序运行之前必须先进入my.txt文件所在的目录下,否则打开open失败
      或者
      open(”/dev/my.txt");//爱在哪个目录下就在哪个目录下

掌握linux系统必要命令:

建议:通过输入各种命令替代图形界面操作方式
命令格式:命令名 选项

  1. pwd:获取当前所在路径

  2. ls:获取目录和文件的信息
    形式1:
    ls -lh //获取当前目录下所有的目录和文件的详细信息

    形式2:
    ls -lh 文件名 //获取此文件的详细信息
    例如:
    ls -lh /home/tarena/qw.c 得到以下信息:
    -rwxrw-r-- 1 tarena tarena 70 Jun 25 16:36 qw.c
    说明:
    ‘-’:表示此文件就是一个普通的文件
    ‘rwx’:表示当前登录linux的用户对此文件可以读(查看文件),可以写(向文件写入信息),可执行
    ‘rw-’:表示当前登录linux的用户所在的组对此文件可以读,可以写,不可执行运行
    ‘r–’:表示其他的linux用户对此文件可以读,不可写,不可执行
    ‘1’:表示硬连接数(不关注)
    ‘tarena’:表示当前登录linux系统的用户名
    ‘tarena’:表示tarena用户所在的组
    ‘70’:表示此文件大小为70个字节
    “Jun 25 16:36”:文件的创建日期
    ‘qw.c’:文件名

  3. clear:清屏命令

  4. cd:切换路径:cd /home/tarena

  5. mkdir:创建目录:mkdir -p /home/tarena/hello/hello1

  6. touch:创建空文件:touch /home/tarena/hello.txt

  7. rm:删除目录和文件: rm -fr /home/tarena/hello

  8. cp:文件或者目录拷贝:cp -fr 源文件 新文件
    cp -fr 源目录 新目录
    注意:cp hello.txt hello/
    分3种:

    1. hello是一个目录并且存在,就是将hello.txt拷贝一份到hello目录下
    2. hello是一个目录并且不存在,命令cp报错
    3. hello是你想象的,你认为的目录但是不存在,并且命令形式:cp hello.txt hello 就是一个文件的拷贝

    切记:只要是目录操作,建议最后一定加分隔符’/‘,来区分是目录还是文件
    建议每次输入命令,用TAB键来补全,也会顺便给你添加’/’

9. **mv:移动**,剪切
 
10. **cat 命令**:快速查看文件的内容
    例如:cat hello.txt
  
11. **echo命令**:向显示器打印输出数据命令
    例如:echo  "我是大神"或者echo 我是大神
    注意:此命令一般配合">"和">>"(统称重定向符)
    例如:
    cd /home/tarena/
    touch hello.txt
    echo 我是大神 > hello.txt  意思是:先将hello.txt文件内容删除,然后将新内容写入到文件
    cat  hello.txt
    echo 我是小神 >> hello.txt 意思是:将新内容追加到文件的后面
   cat hello.txt
  1. find命令:到某个指定的路径下找文件或者目录
    格式:find 路径 -name 要找的文件名
    例如:find /usr/include -name stdio.h
    语义:到/usr/include目录下找一个文件名为stdio.h这个文件

  2. grep命令:到某个路径下的某个文件中搜索字符串
    例如:grep “我是大神” * -Rn
    语义:在当前目录下的所有文件中搜索我是大神字符串
    “*”:表示全部文件
    “-Rn”:到子目录下也同样搜索,并且打印字符串所在的行号

  3. linux系统解压缩的三条终极命令
    linux常用的两种压缩格式:bz2和gz
    压缩命令
    tar -jcvf 压缩包.tar.bz2 目录或者文件
    tar -zcvf 压缩包.tar.gz 目录或者文件
    解压缩
    tar -xvf 压缩包.tar.bz2 / 压缩包.tar.gz
    例如
    cd /home/tarena/
    mkdir hello
    touch hello.txt
    echo 我是大神 > hello.txt
    cat hello.txt
    echo 我是小神 >> hello.txt
    cat hello.txt
    mv hello.txt hello/
    tar -jcvf hello.tar.bz2 hello/ //把hello目录压缩成hello.tar.bz2压缩包
    tar -zcvf hello.tar.gz hello/ ///把hello目录压缩成hello.tar.gz压缩包
    tar -xvf hello.tar.bz2
    tar -xvf hello.tar.gz

掌握大名鼎鼎的linux编辑器软件:vim

  1. 常用的开发编辑器软件:vim,vscode,sublime等
    重点放在vim

  2. vim命令格式:vim 文件名 //打开一个文件

  3. vim三种模式:可视模式,编辑模式,命令行模式
    可视模式:只能看不能编辑
    编辑模式:可以输入各种文本信息命
    令行模式:给vim输入各种控制命令

  4. vim三种模式之间的转换
    明确:第一次刚执行vim命令之后,首先进入可视模式
    可视模式-----按i键或者o键或者a键---->编辑模式
    编辑模式-----按ESC键----------------->可视模式
    可视模式-----按shift+:组合键--------->命令行模式
    编辑模式-----先按ESC进入可视模式—>按shift+:组合键--------->命令行模式

  5. vim命令行模式下相关的命令
    w:保存文件
    q:不保存并且退出vim
    wq:先保存后退出vim
    q!:强制直接退出,不保存文件

    替换操作
    %s/原来内容/新内容/g:将文件中原来的内容全部替换成新内容
    n1,n2s/old/new/g:将文件从n1行到n2行所有的old内容换成new内容
    例如:6,9s/小/大/g:将文件的第6行到第9行的小替换成大
    ! linux命令,例如:! ls :在vim命令中来执行linux的其他命令,再例如:! cd /home/tarena
    案例:练习vim,打开一个新文件,随意输入各种信息

  6. vim快捷键(前提是先切换到可视模式下,然后再各种快捷键)

    1. 方向键以后不要用上下左右,而是用:h(左)j(下)k(上)l(右)替换
    2. 行选中:shift+v然后按hjkl方向键选中
      列选中:ctrl+v然后按hjkl方向键选中
    3. 复制:y键
    4. 粘贴:p键
    5. 剪切:x键
    6. 撤销:u键
    7. 撤销之后由反悔:ctrl+r
    8. 保存退出:ZZ键
    9. 先进入命令行模式执行:sp 文件名,实现上下分屏
      先进入命令行模式执行: vs 文件名,实现左右分屏
      目的:一个屏幕上可以同时编辑多个文件
      屏幕切换快捷键:ctrl+ww

    10. 搜索:先按/然后再后面输入要搜索的信息,然后按小n键表示向下搜索,按大N键表示向上搜索
    11. 自动补全:ctrl+n,先输入开头的一个字符或者多个字符,然后按ctrl+n自动补全后面的内容
    12. 自动格式化文本内容,让代码变得整齐划一,好看:先行选中然后按=键
    13. 跳转到文件的末尾:G键
    14. 跳转到文件的开头:gg键
    15. 跳转到指定的某个一行:先进入命令行模式,然后输入行号即可,例如:14,跳转到14行
    16. 复制某几个单词,字母:先按v键,然后按方向键选中单词,字母,最后按y键复制或者按x剪切,然后按p键粘贴
  7. vim阅读工具
    命令:
    使用
    ctags -R * //在工程目录执行,生成tags文件,记录工程中标识符位置
    Ctrl+] //跳转到光标所在标识符定义位置
    Ctrl+o //跳转回当前位置



第二课:C语言编程基础

C语言定义

它是计算机编程的一种语言,除了C语言,还有C++,java,python等
不管是哪种编程语言,他们都是实现人和计算机交流的
利用C语言能够编写一个程序,让计算机工作,例如:像显示器打印输出一段话
例如:中国人<-----汉语------->中国人
中国人<-----汉语/英语–>美国人
人<---------C语言/C++语言等---->计算机
1.1 背
语法
经典代码
公式

C语言发展

C语言之父:丹尼斯里奇
C语言经典书籍:<>,作者丹尼斯里奇,正式推动了C语言发展
1989,C89标准诞生(类似普通话)
1999,C99标准诞生,基于C89引入了一些优秀特性(扩展功能)

第一个标准C语言程序

具体实施步骤如下:
1)编写C程序
cd /home/tarena
mkdir stdc
cd stdc
vim helloworld.c 添加输入以下内容:

 /*
 这是我的第一个c语言程序
 我很开心
 */
 //这是我的第一个程序
 //好开心
 #include <stdio.h>
 int main(void)
 {
   
 printf("hello,world\n");
 return 0;
 }

保存退出
继续执行以下命令:
gcc helloworld.c 作用:编译程序
ls -lh 此时多路一个a.out文件
./a.out 作用:运行a.out程序

程序说明(C语言编程规矩)

  1. C程序的文件分两类:源文件和头文件,他两本质一样
    源文件:都是以".c"后缀结尾
    头文件:都是以".h"后缀结尾
    注意:任何C程序必须有一个源文件,头文件可以有,可以没有

  2. C程序要包含一个别人写好的头文件(就是将头文件的内容全部拷贝过来),包含头文件的方法有两种:
    语法: include<头文件名>
    #include <stdio.h>:include在C语言中是一个关键字(有特殊含义功能的一个单词
    不可随意使用),如果include前面加#,表示要包含一个头文件
    stdio.h:就是标准C语言的一个头文件(大神已经帮你写好了)
    此文件位于linux系统的/usr/include/目录下

    问:这一对<>什么意思呢?
    答:如果是<>,表示将来让gcc编译器到/usr/include目录下找stdio.h头文件
    如果是"stdio.h",表示将来gcc先到当前目录下找stdio.h,如果找不到再 去/usr/include目录下找
    结论:包含头文件的两种写法:
    #include <stdio.h>
    #include “stdio.h”

  3. C程序只能有一个主函数叫main,并且main函数的前面必须是int
    并且main函数后面要跟一对圆括号,括号里面写void
    由于main函数是自己编写的,所以还要跟一对{},{}包含的内容就是main函数

    int main(void){
    里面就是将来要执行的语句
    }
    将来给CPU运行的命令,也就是程序的执行必须从main函数开始
    然后CPU从main函数依次一条条的向下执行

  4. 人生认识的第一个标准C库函数 printf
    此函数是标准C语言已经写好的(大神写好的),咱们直接使用即可 为了使用此函数, 必须包含头文件:stdio.h
    注意:'\n’表示回车换行,就是打印完信息之后最后将光标换到下一行,如果没有反斜杠继续停留在本行
    例如: printf(“abc”);printf(“efg\n”);
    效果:abcefg
    pirntf(“abc\n”);printf(“efg\n”);
    效果:abc
    efg
    printf 利用占位符可以打印输入指定的数字信息:
    %d占位符功能:按照整数形式打印输出一个数字
    例如:printf("1+1=%d\n",2);语义:将来数字2会放到%d这个位置,然后将1+1=2这个信息输出到显示器上
    printf("1+1 =%d\n", 1+1);语义:先算1+1=2,然后把计算的结果放在%d这个位置最后打印1+1=2

  5. C程序的主函数main中(花括号里面的内容)编写规范

    1. 每条语句后面必须跟分号";" 函数中的每条语句必须跟分号来表示此条语句的结束
    2. 执行书序:从上往下挨个执行
    3. 只要遇到或者执行return这个关键字,c程序立马结束
      return后面可以跟一个数字,例如:
      return 0;表示告诉操作系统,此程序执行结束了并且执行的很正常
      return —1;表示告诉操作系统,此程序执行结束了但是执行的时候有点问题
      例如:main函数的形式如下
       int main(void){
             
         printf("你好,世界,”);//限制性
         printf  ("hello,world\n");
         return 0;
       {
             
      

  6. main函数最后执行return返回也就是让CPU执行到这程序就结束了

  7. C程序注释(代码的解释说明)两种方式:
    一对/注释的内容/:优点:多行注释, 缺点:不能嵌套
    一对//后面跟要注释的内容:优点:可以嵌套,缺点:只能单行注释
    编译C程序,执行以下命令:

cd /home/tarena/stdc/    
    gcc helloworld.c //编译程序
    ls  -lh  //查看a.out的详细信息,此a.out就是生成最终二进制可执行程序(计算机能够执行的一个文件)
       -rwx....    a.out
    ./a.out  //运行a.out这个程序,将来CPU根据程序的要求做相关的动作

  //例2:
 #include<stdio.h>
/*
 这是我的第一个c语言程序
 我很激动
 * 
  */
// 这个仅仅作为一个测试

int main(void){
   
  printf("你好,世界。");
  printf("hello,world\n");
  printf("1+1 = %d\n",2);
  printf("2+8 = %d\n",2+8);
  printf("2-8 = %d\n",2-8);
  printf("2*8 = %d\n",2*8);
  printf("8/2 = %d\n",8/2);
  //写完,保存退出,然后重新执行:gcc helloworld.c 然后执行 ./a.out 运行
  return 0;
}


程序编译说明

gcc:它是一个编译器,类似翻译官,将源文件helloworld.c翻译成a.out计算机能够识别能够看懂的可执行文件
gcc使用命令格式:gcc 源文件 (变态的编译方法),此种写法最终生产的文件都叫a.out
:如果不想取名叫a.out,怎么办呢?
:搞清楚gcc工作流程

gcc编译器

(作者:GNU软件之父理查德斯托曼)
功能:将源文件翻译成可执行文件
gcc工作要经过三步骤(目前了解即可):

  1. 先预处理
    就是将别人的头文件内容全部拷贝到当期源文件中
    例如:#include <stdio.h>,意思就是将stdio.h里面的内容全部拷贝到helloworld.c中

  2. 然后编译
    就是将预处理之后的源文件翻译成可执行文件(计算机对此文件是能够识别的)

  3. 最后链接
    就是将别人写好的函数代码,例如printf,加载到自己编写的文件中,最终翻译成CPU
    能够执行运行的可执行文件
    问:以上三步骤如何分步骤实现呢?
    答:只需gcc的相关的选项即可完成

  4. 掌握gcc的常用选项

    1. 预处理
      -o: 后面跟要生成的新文件
      -E: 进行预处理

      例如:gcc -E helloworld.c -o helloworld.i
      语义:对helloworld.c进行预处理,生成预处理以后的文件helloworld.i

    2. 只编译不链接
      -c:只编译不链接,只是把自己的源文件生成可执行文件,此过程不会将别的函数加载过来
      例如:gcc -c -o helloworld.o helloworld.i
      语义:将预处理文件helloworld.i只编译不链接生成可执行文件helloworld.o
      helloworld.o此文件CPU识别,但是不能运行,因为还没有加载别人的函数

    3. 链接
      命令:gcc -o 可执行文件 可执行文件.o
      gcc -o helloworld.o helloworld.i

 案例:演练gcc的三种使用方式
 实施步骤如下:
 cd /home/tarena/stdc/
 ls  helloworld.c //查看文件是否存在

gcc编译源文件的三种方法

  1. 第一种编译方式:流氓方法
    gcc helloworld.c //生成a.out
    ./a.out

  2. 第二种编译方式:分步编译
    gcc -E -o helloworld.i helloworld.c //先预处理
    vim helloworld.i //挑战看看此文件,只看文件的最后的内容(是自己编写的)
    gcc -c -o helloworld.o helloworld.i //然后只编译不链接
    gcc -o helloworld helloworld.o //最后将helloworld.o进行链接操作生成最终的可执行文件helloworld
    ./helloworld

  3. 第三种编译方式:一步到位
    gcc -o helloworld helloworld.c
    注意:此方法也就是将方法2进行合并了!

详解printf函数

  1. 此函数属于标准C的函数,直接使用即可
    但是需要包含头文件stdio.h

  2. 此函数的使用语法格式:
    printf(“输出的内容\n”);
    例如:

    • printf(“hello,world\n”); //输出hello,world信息之后再加一个换行
    • printf(“hello,world”); //只输出hello,world信息,但是没有换行
    • printf(“%d, %d\n”, 1, 2); //输出1,2
      说明:%d:占位符
      第一个%d给数字1占位,第二个%d给数字2占位


第三课C语言的变量

详解内存特性和概念

  1. 内存功能:用于暂存程序和程序中的各种数据(例如:1,2,3等)
    :为何不用CPU和硬盘呢?
    :CPU存的数太少了
    硬盘速度太慢了
    所以选择内存
    程序玩的不是程序,玩的是内存

  2. 内存相关的概念
    字节(Byte俗称格子):就是将内存划分为一块一块的区域,好比划分为一个一个格子一样
    每块区域简称字节,能够存储程序中的数据,也就是内存中最小的
    存储单位就是字节
    注意: Byte的简称 B
    换算公式:
    1KB = 1024B
    1MB = 1024KB=10241024B
    1GB = 1024MB=1024
    1024KB=102410241024B

  3. 地址(address):就是给内存的每个字节指定一个编号,从0开始,类似给每个房间指定一个房间号一样
    此编号简称地址
    切记:不管在哪里,只要知道了内存的某一个字节的地址,将来就可以通过地址对内存进行访问(读或写)
    类似:不管快递小哥在哪里,快递小哥知道你的地址,就可以给你送快递

  4. 存储区(Buffer):就是一个字节或者多个字节组成的存储区域,简称存储区
    :为何有这个概念呢?
    :比如现在有一个数大小为300亿,明确告诉你一个字节肯定存不下300亿这个数
    所以需要4个字节的内存来存储300亿这个数,而这个4字节的内存区域构成了存储区

  5. 首地址(base address):存储区的第一个字节的地址
    内存条
    首地址:4
    问: c程序如何分配内存空间来存储数字呢?
    答:切记:任何程序要想访问内存,必须先分配获取到内存才能访问,如果没有分配获得到内存,
    直接去访问,操作系统直接将干掉,杀死(操作系统心里)

C语言基础之变量

变量功能
就是给C程序分配内存空间,一旦分配内存成功,程序就可以对内存进行存储数字环科院修改存储的 数字

既然程序玩的是内存,那么程序如何从内存分配存储区的空间呢?

通过变量来实现内存的分配(类似开房)

  1. 变量定义的语法格式
    1. 切记
    • 何为定义?答:定义就是分配内存
    • 何为初始化? 答:就是给变量对应的内存空间放一个数字
    1. 语法: 数据类型 变量名 = 初始值;
      注意:目前掌握一个数据类型:int(整型数:0,1,2,3…),表示分配4字节内存空间
      此种数据类型的占位符:%d
      例如:printf(“%d\n”, 变量名);

    2. 定义变量的形式:

      • 形式1:只定义不初始化
        int a;

      • 语义:定义变量a,本质就是让操作系统给你分配一块内存空间来存储数字
        并且这块内存空间叫a名称,将来访问a名称就是在访问内存空间
        并且这块内存空间的大小连续4字节,并且这4个字节的内存空间
        的数字将来可以随时改变

      • 注意:此时这块内存空间存储的是一个随机乱七八糟的数字

      • 形式2:定义的同时并且初始化
        int a = 250; //分配4字节内存空间并且同时往里面放一个250数字

      • 形式3:定义之后再初始化
        int a;
        a = 250;

      • 形式4:连续只定义多个变量
        int a1, a2, a3; //定义三个变量a1,a2,a3 此时空间存储的是一个随机乱七八糟的数字

      • 形式5:连续定义并且初始化
        int a1 = 250, a2 = 251, a3 = 252;

      • 形式6:连续定义多个变量之后再初始化
        int a1, a2, a3;
        a1 = 250;
        a2 = 251;
        a3 = 252;
        例:

/* var.c :变量演示*/
/* 编译运行命令 gcc -0 var var.c 然后 .var */

#include<stdio.h>

int main(void){
   
   //1.形式1 
   int a;  //只定义不初始化
   printf("a = %d\n",a);  //打印变量a的值(打印分配的内存里面的数字)
   
   //修改改变量的值,也就是重新给内存放置一个新的变量
   a = 520;
   printf("a = %d\n",a);
 
   //2.形式2:定义并且初始化
   int b = 250;
   printf("b = %d\n",b);

      //修改改变量的值,也就是重新给内存放置一个新的变量
   b = 520;
   printf("b = %d\n",b);

   printf("a + b =%d\n",a+b);
   printf("a - b =%d\n",a-b);
   printf("a * b =%d\n",a*b);
   printf("a / b =%d\n",a/b);
        
   //3. 形式3:连续定义但不初始化(都是随机数)
   int c,d,e;
   printf("c=%d,d=%d,e=%d\n",c,d,e);
   
   //4.形式4.连续定义并且初始化
   int i = 100,j = 200;
   printf("i=%d,j=%d\n",i,j);
   return 0;
}

  1. 问:变量名是否可以随意起名?
    答:变量名(a)和函数名(printf)在C语言中统称标识符(用来区分,标识的符号)

标识符的名称规则

  1. 不能以数字开头,第一个字符只能以字母和下划线开头,后面可以有数字
    例如:int 2a; //错误
    int a2; //可以

  2. 标识符不能用关键字(有特殊功能含义的单词)
    目前掌握的关键字如下:include, int, void, main, return
    例如:int int; //错误

  3. 要区分大小写
    例如:int a 不等于 int A;

  4. 采用驼峰或者下划线命名
    驼峰:int nAge;
    int CreateWindows
    linux程序员基本采用下划线命名:int create_windows;

书写风格

问:写C语言代码书写格式可以任意吗?
答:理论上随意,但是还要讲究美观

  1. int main(void) {printf(“hello,world\n”); return 0;} //没毛病,太难看了
    该加空格的加空格,TAB键的TAB键,对齐,缩进都有讲究,让代码看起来美观
    int main(void)
    {
     //独占一行
        printf("...."); //一条语句占一行
        return 0;	  //一条语句占一行
    } //独占一行

  1. 代码编写区域建议显示器左侧2/3,如果超过了,换行写
    printf(“%d %d %d %d %d %d %d %d %d”,1, 2, 3,4,5,6,7,8,9,10);
    printf(“%d %d %d %d %d %d %d”
    “%d %d %d %d %d %d %d\n”,
    1, 2, 3,4,5,6,7,8,9,10);

变量的数据类型

  1. 数据类型的作用:让编译器gcc预算变量将来要分配的内存大小不同的数据类型将来分配的内存大小不一样
  2. C语言的基本数据类型
关键字 含义 分配内存大小 数字范围
char 字符类型(本质单字节的整数) 1字节 -128~127(背)
unsigned char 无符号单字节整数 1字节 0~255(背)
short 双字节整数 2字节 -32768~32767
unsigned short 无符号双字节整数 2字节 0~65535
int 四字节整数 4字节 -2^31 ~2^31-1
unsigned int 无符号四字节整数 4字节 0~2^32-1
long 四字节整数 4字节 -2^31 ~2^31-1
unsigned long 无符号四字节整数 4字节 0~2^32-1
long long 八字节整数 8字节 -2^63 ~2^63-1
unsigned long long 无符号八字节整数 8字节 0~2^64-1
float 单精度浮点数 4字节 很大
double 双精度浮点数 8字节
  • 应用:
    char a =1; //分配1字节内存
    short a = 1 ; //分配2字节内存
    unsigned int a =1 ; //分配4字节内存
    long a =1 ; //分配4字节
    unsigned long long a =1; //分配8字节
    double a =1.1 ; //分配8字节

  • 切记:
    unsigned int 和unsigned long 对于gcc 编译器来说不一样:
    对于32位系统/64系统,unsigned int 都是4字节
    对于32位系统,unsigned long 同样也是4字节
    对于64位系统,unsigned long 是8字节

  1. 有符号和无符号之分
    1. 每种数据类型都有有符号和无符号之分
    2. 有符号数据有正负之分,可以用signed关键字来修饰,也可以不用写
    例如:
    int a = 250;
    等价于
    signed int a = 250;
    3. 无符号数据只有0和正数,必须用unsigned关键字修饰
    unsigned int a = 250;

    切记
    unsigned int和unsigned long
    对于32位/64操作系统,unsigned int分配的内存就是4字节
    对于32位操作系统,unsigned long分配的内存就是4字节
    对于64位操作系统,unsigned long分配的内存就是8字节
    结论:如果将来用一个变量来保存内存的某个地址,一定要用unsigned long
    后续指针课程再来理解!

  2. char(字符)类型
    常量:其值不可改变,例如:250

    1. 字符常量用单引号’'括起来,例如:‘A’,‘a’
      区分大小写
      例如:
      char a = ‘A’; //表面看是分配1字节内存,并且而且放了一个字符常量 ‘A’这样理解是错误的
      本质是分配1字节内存空间,并且内存里面放了字符常量 ‘A’ 的ASCII码 65 (就是一个整数)

    2. 本质:字符类型的变量对应的内存本质上存储的就是一个整数(数字)而已
      这个数字有对应的专业术语叫ascii码
      说明:字符和整数之间可以互转
      例如:
      字符 整数
      ‘A’ 65
      ‘B’ 66
      ‘a’ 97
      ‘b’ 98

      所以:‘d’-‘a’ = 本质就是 100-97=3

  3. 字符类型变量的占位符
    %c,%d
    例如:
    char c = ‘A’; //表面看定义字符变量c并且初始化为字符常量’A’
    //看清本质:就是分配1字节内存空间,并且往这个内存空间放了一个数字65
    printf(“c = %c\n”, c); //打印输出按字符常量格式输出,c=‘A’
    printf(“c = %d\n”, c); //打印输出按照整数格式输出,c=65

案例:

/*字符类型演示*/

#include<stdio.h>

int main(void)
{
   
   char a = 'A';
   printf("按照字符形式显示:%c,按照整数ASSCII码显示:%d\n",a,a);

   a = 'B';
   printf("按照字符形式显示:%c,按照整数ASSCII码显示:%d\n",a,a);

   char b = 'd';	
   char c = 'a';
   printf("b-c =%d\n",b-c);  //本质是ASCII码相减
   
   char d  =67;
   printf("按照字符形式显示:%c,按照整数ASSCII码显示:%d\n",d,d);
   
   unsigned char e =68;
   printf("按照字符形式显示:%c,按照整数ASCII码显示:%d\n",e,e);

   unsigned char f = 'E';
   printf("按照字符形式显示:%c,按照整数ASCII码显示:%d\n",f,f);

   return 0;

}
  1. 转义字符(特殊字符)
 '\n':换行符,将光标移动到下一行的行首
 '\r':回车符,将光标移动到当前行的行首
 '\t':TAB键
 '\\':输出一个
 '\'':输出一个'
 '\"':输出一个"
 '%%':输出一个%

例如:利用printf要求向屏幕上输出这些信息:
abc
(TAB键)cbd’efg’“hjk”%
答案:printf(“abc\n\tcbd\‘efg’\“hjk”\%%\n”);

  1. 整型数据类型(int)
    int特点:
    int代表2字节或者4字节整数
    可以用short或者long进行修饰,最终得到6大形势,也就是上面表格的内容
    int的六种形式
    1. short
    用2字节表示,有符号
    例如:
    short int a = 250;
    等价于
    short a = 250;
    2. unsigned short
    用2字节表示,无符号
    例如:
    unsigned short int a = 250;
    等价于
    unsigned short a = 250;
    3. long
    用4字节表示,有符号
    例如:long int a = 250;
    等价于
    long a = 250;
    4. unsigned long
    用4字节表示,无符号
    例如:unsigned long int a = 250;
    等价于unsigned long a = 250;
    5. int
    用4字节表示,有符号
    例如:int a = 250;
    6. unsigned int
    用4字节表示,无符号
    例如:unsigned int a = 250;

  2. 整型常数
    (细腻,高薪,高手)
    100:gcc编译器默认当成int类型
    100L:gcc编译器当成long类型
    100LL:gcc编译器当成long long类型
    100u:gcc编译器当成unsigned int类型
    100UL:gcc编译器当成unsigned long类型(最爱)
    用途:用于后期课程的数据类型的转换用

  3. 浮点数类型
    float/double
    例如:

    • 1.23: gcc编译器默认当double类型,8字节
    • 1.23f: gcc编译器当float类型,4字节
      注意:浮点数在计算机中都是近似值(差不多得了)
      例如:1.23实际是1.2300001
  4. 数据类型和对应的占位符

数据类型 占位符
char %c(字符显示)和 %hhd(整型数显示)
unsigned char %c(字符显示)和 %hhd(整型数显示)
short %hd
unsigned short %hu
int %d
unsinged int %u
long %ld
unsigned long %lu
long long %lld
unsigned long long %llu
float %f或者%g
double %lf或者%lg
%f,%lf和%g,%lg 区别在于前者会保留后面多余的0,后者不会保留
例如: 2.3 ---->

sizeof 关键字

利用sizeof关键字可以获取变量或者数据类型将来分配的内存大小
1)作用:计算一个变量或者一种数据类型所占用的内存空间大小,会给你一个大小结果
单位是字节

2)格式:sizeof(变量名或者数据类型名),返回字节数
例如:int a = 250;
printf(“sizeof(a)的大小是%d\n”, sizeof(a));
printf(“sizeof(a)的大小是%d\n”, sizeof(int));
long long b =1;
printf(“%d %d\n”,sizeof(a),sizeof(long long));

3)切记:sizeof关键字后面的小括号里对任何存储区内容的修改都是无效的
案例:

mkdir  /home/std/day03
  cd /home/std/day03
  vim sizeof.c 
/* sizeof 演示 */

#include<stdio.h>

int main(void)
{
   
  char a =1;
  unsigned char b = 2;
  printf("sizeof(a)=%d,sizeof(char)=%d\n",sizeof(a),sizeof(char));
  printf("sizeof(b)=%d,sizeof(unsigned char)=%d\n",sizeof(b),sizeof(unsigned char));

  short c =3;
  unsigned short d =4;
  printf("sizeof(c)=%d,sizeof(short)=%d\n",sizeof(c),sizeof(short));
  printf("sizeof(d)=%d,sizeof(unsigned)=%d\n",sizeof(d),sizeof(unsigned short));

  int e =5;
  unsigned int f =6;
  printf("sizeof(e)=%d,sizeof(int)=%d\n",sizeof(e),sizeof(int));
  printf("sizeof(f)=%d,sizeof(unsigned int)=%d\n",sizeof(f),sizeof(unsigned int));

  double m = 2.1;
  printf("sizeof(m)=%d,sizeof(double)=%d\n",sizeof(m),sizeof(double));

  long g = 5;
  unsigned long h = 8;
  printf("sizeof(g)=%d,sizeof(long)=%d\n",sizeof(g),sizeof(long));
  printf("sizeof(h)=%d,sizeof(unsigned long)=%d\n",sizeof(h),sizeof(unsigned long));

  long long bb = 10;
  unsigned long long j = 20;
  printf("sizeof(bb)=%d,sizeof(long long)=%d\n",sizeof(bb),sizeof(long long));
  printf("sizeof(j)=%d,sizeof(unsigned long long)=%d\n",sizeof(j),sizeof(unsigned long long ));

  float k = 5.3;
  printf("sizeof(k)=%d,sizeof(float)",sizeof(k),sizeof(float));

  int i =250;
  sizeof(i=300);
  printf("i=%d\n",i);
  return 0;

}

  gcc -o sizeof sizeof.c
  ./sizeof


scanf 输入函数

  1. 已经掌握了输出函数:printf
  2. 输入函数scanf功能:能够让用户从键盘给程序输入数字并且保存到变量中(保存到内存中)
  3. 格式:scanf(“占位符”,变量的地址);
    例如:
int a, b;
scanf("%d%d", &a, &b); //从键盘上输入两个数分别给a和b,按照整型数的形式输入
//键盘输入:100  200
int a,b,c;
scanf("%d%d%d",&a,&b,&c);  //此时用户从键盘输入方式:100空格 200 空格 300 空格 最后回车,结果是a =100,b =200,c=300
//如果要输入多个数值,中间用空格分开

或者:
scanf(“%d,%d”, &a, &b); //键盘输入:100,200
参考代码 scanf.c

/*scanf函数演示*/

#include<stdio.h>

int main(void)
{
   
  int a =0;
  printf("请输入一个数字:");
  scanf("%d",&a);    //从键盘捕获输入的数字保存到变量a中
  printf("a = %d\n",a);

  int b,c,d;
  printf("请输入三个数字(中间用空格分开):)");
  scanf("%d%d%d",&b,&c,&d);
  printf("b=%d,c=%d,d=%d\n",b,c,d);
 
  return 0;
}
  1. 注意
  1. 为了使用此函数,必须添加头文件:#include <stdio.h>
  2. scanf函数双引号里面不要包含占位符以外的其他内容
  3. 如果一次要输入多个数字,每个数字之间用空格键(帅的人)或者TAB键或者换行键隔开

进制转换

  1. 明确:计算机系统中,又将内存的一个字节分为8段,每段只能存0或者1
    结论:要想把一个数字存储到字节里,必须首先将这个数字分拆成8个0和1
    如果一个数字用一个字节存不下,可能需要两个字节或者四个字节
    也就是将这个数字分拆成16个0和1或者32个0和1
    所以计算机只认0和1
    例如 :
    char a = ‘A’; //分配1字节内存空间,把字符A的ASCII码分65分拆成8个0和1 (需要8位)存储到内存中即可
    short a = 250; //分配2字节内存空间,把250分拆成16个0和1 (需要16位)存储到内存中即可
    int a =250; //分配4字节内存空间,把250分拆成32个0和1 (需要32位)存储到内存中即可
    概念:字节的每一个段有对应的专业术语:bit位,每一段就是一个bit,就是一位
    参见:BIT.png图

  2. 二进制
    1. 概念:
    采用一组0或者1表示数字的方法叫二进制表示形式
    例如:现在有一个数字90(给人看)
    如果用二进制表示形式为:01011010(给计算机看)
    2. 特点
    0.二进制和十进制(0,1,2,3,4,5,6,7…)都是表示数字的两种方式
    计算机只认二进制,程序员一般用10进制

    1. 计算机只认二进制数字0和1
    2. 二进制表示方式里每个数都有一个编号
      例如:编号如下:
      7 6 5 4 3 2 1 0 编号
      二进制数
      例如:前提是char类型
      高位 地位
      7654321 二进制数编号
      0100000 二进制数 (其中第六位的1对应的10进制数字值是2的6次方=64)
 3. 二进制表示方式里每个1单独代表一个数字,这个数字的只就是2的编号次方
    7 6 5 4 3  2 1 0  编号
    0 0 0 1 0  0 0 0
    结果:
    00010000这个二进制数对应的数字是2的4次方=16(10进制)
    7 6 5 4 3  2 1 0  编号
    0 0 0 1 0  1 0 0
    结果:
    00010100这个二进制数对应的数字是2的4次方+2的2次方=20(10进制)
    
 4. 如果两个相邻的二进制内容一样,那么左边的数字是右边数字的2倍
    7 6 5 4 3  2 1 0  编号
    0 0 0 1 1  0 0 0
    结果:第4位的1代表2的4次方,第3位的1代表2的3次方,那么左边是右边的2倍
    
 5. 二进制数字加1的时候把编号0位置开始的多个连续的1都变成0,把最左边的0变1
    例如:
    01011111  + 1 = 01100000
    01011110  + 1 = 01011111
    76543210    二进制编号
    00001111   +1  =  00010000
    00001110 + 1 =    00001111
    
 6. 用二进制表示的非负数(0和正数)去掉最右边的二进制数字结果相当于这个数字除以2并保留   整数部分
    例如:
    7 6 5 4 3  2 1 0  编号
    0 1 1 0 0  1  1 0 二进制数 = 102
    0 1 1 0  0  1 1 去掉最右边的0以后的二进制数字 = 51
  1. 二进制和十进制之间的转换

    1. 二进制表示的非负数转成十进制的时候就是把每个二进制位的内容单独转换然后求和
      例如:
      76543210 二进制数编号
      01101001 二进制表示形式
      结果:转成十进制之后的数值=2的6次方+2的5次方+2的3次方+2的0次方
      =64+32+8+1=105,显然这个数字用1个字节可以存下

      例如: 前提是char类型
      76543210 编号
      01010101 二进制数 A(非负数)
      A对应的10进制 = 2的6次方 +2的4次方 +2的2次方 +2的0次方 = 64 +16+4+1 = 85
      结论:将来存储85就是将85分拆成8个 0和1即可,01010101,存储到1字节的内存空间即可

      明确: 计算机只认二进制,内存中只能存储数字的二进制形式,至于10进制,8进制,16进制都是对内存中2 进制数的另外三种

    2. 进制表示的非负数转二进制
      转换过程:采用"除2取余,逆序排列"法。
      具体做法是:用2整除十进制整数,可以得到一个商和余数;
      再用2去除商,又会得到一个商和余数,
      如此进行,直到商为小于1时为止,然后把先得到的余数 作为二进制数的低位(0开始),后得到的余数作为 二进制数的高位,依次排列起来。
      例如
      91这个十进制转二进制
      91/2=45 余1
      45/2=22 余1
      22/2=11 余0
      11/2=5 余1
      5/2=2 余1
      2/2=1 余0
      1/2=0 余1
      0/2=0 余0
      结果
      91二进制数=01011011

      如:255转二进制
      255/2=127 -----> 余1
      127/2=63 -----> 余1
      63/2=31 -----> 余1
      31/2=15 -----> 余1
      15/2=7 -----> 余1
      7/2=3 -----> 余1
      3/2=1 -----> 余1
      1/2=0 -----> 余1
      结果:255二进制=111111111

      789二进制为:1100010101
      789/2=394 余1
      394/2=197 余0
      197/2=98 余1
      98/2=49 余0
      49/2=24 余1
      24/2=12 余0
      12/2=6 余0
      6/2=3 余0
      3/2=1 余1
      1/2=0 余1

    3. 负数的十进制和二进制之间不可直接转换,必须借助相反数, 负数的十进制转二进制的步骤,
      三步骤
      1. 首先计算出负数的相反数
      2. 然后把得到的相反数转换成二进制数
      3. 最后对转换之后的二进制数据取反(意思是1->0, 0->1)后再加1
      例如:-14转二进制
      1. 计算-14相反数为:14
      2. 转成14的二进制:00001110
      3. 取反加1:11110001 + 1 = 11110010
      结论:-14的2进制为 11110010
      明确:有符号类型数字(不加unsigned 关键字修饰的)才能有符号
      二进制数中的左边的位叫符号位,通过此位可以确定数字的符号(正还是负)

    4. 有符号类型数字采用符号
      二进制数字最左边的位叫符号位
      它的值可以用来确定数字的符号
      符号位的值是0表示这个数字是非负数(0或者正数)
      符号位的值是1表示这个数字是负数

    例如:
    现在有这么一个8位的二进制数:01011010,此二进制对应的十进制数为非负数
    现在有这么一个8位的二进制数:11011010,此二进制对应的十进制数为负数
    现在有这么一个16位的二进制数:0101010101011010,此二进制对应的十进制数为非负数
    现在有这么一个16位的二进制数:1101010101011010,此二进制对应的十进制数为负数
    现在有这么一个16位的二进制数: 01011010,此二进制对应的十进制数为非负数 //高8位都是0
    现在有这么一个16位的二进制数:11011010,此二进制对应的十进制数为非负数 //高8位都是0
    现在有这么一个16位的二进制数:1111111111011010,此二进制对应的十进制数为负数
    
    例如:
    目前有这么一个二进制数是:10110110(前提是:如果作为字符类型数字此数必然是负数)
    要求计算这个二进制对应的十进制的负数为:
        1.   先求反在加1:01001001 + 1 = 01001010
        2. 然后计算转换之后的二进制对应的十进制
            01001010=2的6次方+2的3次方+2的1次方=74
        3. 最后求相反数结果为-74
    

    练习:求10101010 二进制的10进制数(char类型) -----> 结果 -86
    求10101010 二进制的10进制数(short类型) ------>结果 170
    好消息:实际开发2进制,10进制,8进制之间的 转换记得用计算器 !

  2. 二进制和八进制
    1. 八进制定义:就是把二进制数字从右到左每三个数为一组
    每组用一个0和7之间的数字替换得到8进制表示形式
    例如:
    原始二进制数:01101010
    按照8进制分组:01 101 010
    然后对分组的数求值:
    01=2的0次方=1
    101=2的2次方+2的0次方=5
    010=2的1次方=2
    结果是01101010二进制数对应的八进制数为152(八进制)

  2. 八进制特点
     程序中可以直接使用八进制数,但是这种数字必须以0开头(例如:0152)
     对应的占位符是0%o,将来在屏幕上就可以看到这个八进制数的形式
     例如:
     int a = 106; //10进制数
     printf("十进制数值是:%d,其八进制数值是:0%o\n", a, a);
  例:
/* 进制转换*/

#include<stdio.h>
int main(void)
{
   
 int a  =105;  //10进制数
  
 // 心里要明明白白,不管是10进制环视8进制,内存只存他们的2进制为:01101001
 printf("a的十进制数是:%d,a的八进制数:0%o\n",a,a) ;
 
 int b = 0151  ; //8进制
 printf("b的十进制是:%d,b的八进制是:0%o\n",b,b);

 return 0;
}

//BIN:二进制 OCT:8进制 DEC:10进制 HEX:16进制
  1. 二进制和十六进制的故事(核心中的核心)
    1. 定义
    把二进制数所有的位数从右到左每4位为一组
    每组用一个字符替换(用a到f之间的字母替换10~15之间数字)
    这种表示方式简称十六进制
    注意:16进制数必须以0x或0X开头,不用区分大小写
    结论:程序中将来所有的二进制建议都是以16进制形式表示,不建议用10进制和8进制
    例如:
    原始二进制:11000101
    分组:1100 0101
    换算 : 12 5
    替换 c 5
    结果:此二进制对应的16进制为0xc5 或 0Xc5 或0XC5
    2. 特点
    3. 必须以0x或者0X开头
    4. 占位符:%#x(字母按小写显示)/%#X(字母按大写显示)
    5. 切记:务必拿下二进制和十六进制的转换,开发必用!
    例如:背下来,否则遭鄙视
十六进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101 (常用)
6 0110
7 0111
8 1000
9 1001
a 1010 (常用)
b 1011
c 1100
d 1101
e 1110
f 1111
     例如:
     二进制			十六进制
     11000101	 	0xc5
     01011010	 	0x5A
     11000011	 	0xc3
     0001 1000 0101 1110	0  x185e
     十六进制		二进制
     0xa54		1010 0101 0100
     0xb8		1011 1000
     0x5a69cd38	0101 1010 0110 1001 1100 1101 0011 1000
     
  6.  总结:程序中不管用10进制也好,8进制也好,还是16进制也是,他们都是对内存中
     存储的二进制数的不同表达方式而已,不管哪种方式,最终内存存的二进制数都是一样的


第四课:运算符和表达式

定义

运算符:就是对内存中的数据进行操作的符号,例如:加法运算符+
表达式:就是数据和运算符结合起来的式子,例如:1+2

运算符

  1. 算数运算符
    加减乘除取余(求模):+,-,*,/,%
    注意
    - 如果参与除法(/)运算的两个数字都是整数则计算结果只保留整数部分,
    例如:5/2=2

    -  /和%不能对整数0进行操作,否则程序中断失败,
      例如:5/0或者5%0  : 报错
    
    - %不能用于浮点数,
      例如:5%1.2,报错
    
    - %的结果与其左边的数字的符号一致,
      例如:-7%2=-1 7%-2=1
    
    - /如果除数为浮点数,最后得到inf无穷大
      例如:5/0.0     得到 inf  无穷大
    
    案例:输入一个秒收,打印对应的小时,分钟和秒数
    例如:3600->1小时0分0秒
    3601->1小时0分1秒
    公式:
    小时=秒数/3600
    分钟=秒数%3600/60
    秒=秒数%60
    例2 :
    
/*算数运算符演示*/
#include<stdio.h>
int main(void)
{
   

  int a=5,b = 2,c = 0;

  printf("a + b = %d\n",a +b);
  printf("a - b = %d\n",a-b);
  printf("a * b = %d\n",a*b);
  printf("a / b = %d\n",a/b);
  printf("a %%b = %d\n",a%b);

  //printf("a / c = %d\n",a / c);   //崩溃
  //printf("a %% c = %d\n",a %c);   //崩溃
  
  double d = 0 ;  //此 0 不是int类型了,而是一个浮点数 double 类型
  printf("a / d = %lf\n",a /d);  //inf
  
  printf("-7 / 3 =%d,7 / -3 = %d\n",-7/3,7/-3);
  printf("-7 %% 3 = %d, 7 %% -3 =%d\n",-7 %3, 7 % -3);
  return 0;
}
  1. 赋值运算符:“=”
    功能:将运算符右边的数字给左边的变量
    1. 形式1
    int a;
    a = 10;
 2. **形式2**:
 int a, b, c;
 a = b = c = 0x10;
 printf("%d %d %d",a,b,c);

 2. 切记:赋值运算符"="不是"=="
 3. 赋值运算符和其他运算符结合起来使用,构成复合运算符
    例如:
    a += b; //a = a + b;
    a -= b; //a = a-b
    a *= b; //a = a*b;
    a /= b;  //a = a/b;
    a %=b; //a = a%b;
    等等
    
 4. 不能给常量和表达式赋值
    例如:100 = 200; //报错
    100 = a; //报错
    a + b = c; //报错   gcc先算a+b 结果肯定是一个常量(数字)
    参考代码:
/* 赋值运算符演示 */
#include
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值