黑马程序员C语言基础(一)第三天

https://www.bilibili.com/video/BV15W411K7k6?p=40

文章目录

  • 低级语言与高级语言
  • c语言优缺点
  • c语言应用领域
  • 通过gcc编译C代码
    • gcc编译器介绍
    • Linux平台下编译代码
    • Windows平台下gcc环境配置(略)
      • 注意事项
  • C语言代码分析
    • include头文件包含
    • main函数
    • {} 括号,程序体和代码块
    • 注释
    • printf函数
    • return语句
  • system函数
    • system函数的使用
    • system返回值,不同系统结果不一样(POSIX标准?保证结果一致?所以最好不要在不同系统间导来导去?)
    • Qt图形界面调用system
    • MFC图形界面调用system
  • C语言编译过程
    • C程序编译步骤
      • 1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
      • 2)编译:检查语法,将预处理后文件编译生成汇编文件
      • 3)汇编:将汇编文件生成目标文件(二进制文件)
      • 4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
    • gcc编译过程
      • 1) 分步编译
      • 一步编译
    • 查找程序所依赖的动态库(ldd)(depends.exe软件)
  • CPU内部结构与寄存器(了解)(略)
    • 64位和32位系统区别
    • 寄存器、缓存、内存三者关系
  • 汇编语言(略)
  • visual studio写c语言步骤(查看反汇编代码)
  • Qt creator写c语言步骤
    • 注意![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513165616519.png)
  • 集成开发环境IDE
    • Qt Creator
    • Microsoft Visual Studio
      • 1) VS常用快捷键
      • 2) VS2013的C4996错误

好多,挑重点

低级语言与高级语言


c语言优缺点

语言特点

  1. 优点
  • 代码量小
  • 执行速度快
  • 功能强大
  • 编程自由
  1. 缺点
  • 写代码实现周期长
  • 可移植性较差
  • 过于自由,经验不足易出错
  • 对平台库依赖较多

c语言应用领域

  • C语言可以写网站后台程序
  • C语言可以专门针对某个主题写出功能强大的程序库
  • C语言可以写出大型游戏的引擎
  • C语言可以写出另一个语言来
  • C语言可以写操作系统和驱动程序,并且只能用C语言编写
  • 任何设备只要配置了微处理器,就都支持C语言。从微波炉到手机,都是由C语言技术来推动的



通过gcc编译C代码

gcc编译器介绍

编辑器(如vi、记事本)是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行!
编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows。

gcc最初用于编译C语言,随着项目的发展gcc已经成为了能够编译C、C++、Java、Ada、fortran、Object C、Object C++、Go语言的编译器大家族。

编译命令格式:

gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
  • 命令、选项和源文件之间使用空格分隔
  • 一行命令中可以有零个、一个或多个选项
  • 文件名可以包含文件的绝对路径,也可以使用相对路径
  • 如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名,Linux平台为a.out,Windows平台为a.exe

gcc、g++编译常用选项说明:

示例:

Linux平台下编译代码

  • gcc warning的意思是警告,是有问题,但不影响编译
  • error是错误,如果遇到error,那么就不能编译了

Windows平台下gcc环境配置(略)

windows怎么用qt MinGW gcc编译c代码

注意事项

Linux编译后的可执行程序只能在Linux运行,Windows编译后的程序只能在Windows下运行。

64位的Linux编译后的程序只能在64位Linux下运行,32位Linux编译后的程序只能在32位的Linux运行。

64位的Windows编译后的程序只能在64位Windows下运行,32位Windows编译后的程序可以在64位的Windows运行。

C语言代码分析

include头文件包含

  • #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
  • 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
  • 可以通过man 3 printf查看printf所需的头文件

#include< >#include ""的区别:

  • < > 表示系统直接按系统指定的目录检索
  • "" 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

stdio.h是在操作系统的系统目录下:

main函数

  • 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
  • main函数是C语言程序的入口,程序是从main函数开始执行。

{} 括号,程序体和代码块

  • {}叫代码块,一个代码块内部可以有一条或者多条语句
  • C语言每句可执行代码都是";"分号结尾
  • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
  • 所有的可执行语句必须是在代码块里面

注释

  • //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
  • /**/叫块注释
  • 块注释是C语言标准的注释方法
  • 行注释是从C++语言借鉴过来的

printf函数

  • printf是C语言库函数,功能是向标准输出设备输出一个字符串
  • printf(“hello world\n”);\n的意思是回车换行

return语句

  • return代表函数执行完毕,返回return代表函数的终止
  • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
  • 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
  • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式

system函数

system函数的使用

#include <stdlib.h>
int system(const char *command);

功能:在已经运行的程序中执行另外一个外部程序
参数:外部可执行程序名字
返回值:
成功:不同系统返回值不一样
失败:通常是 - 1

示例代码:

#include <stdio.h>
#include <stdlib.h>int main()
{//system("calc"); //windows平台system("ls"); //Linux平台, 需要头文件#include <stdlib.h>return 0;
}

示例:

02_system.c

#include <stdio.h>
#include <stdlib.h>
int main()
{system("ls");printf("下雨了!\n");return 0;
}

system返回值,不同系统结果不一样(POSIX标准?保证结果一致?所以最好不要在不同系统间导来导去?)

C语言所有的库函数调用,只能保证语法是一致的,但不能保证执行结果是一致的,同样的库函数在不同的操作系统下执行结果可能是一样的,也可能是不一样的。

在学习Linux发展史时,我们得知Linux的发展离不开POSIX标准,只要符合这个标准的函数,在不同的系统下执行的结果就可以一致。

Unix和linux很多库函数都是支持POSIX的,但Windows支持的比较差。
如果将Unix代码移植到Linux一般代价很小,如果把Windows代码移植到Unix或者Linux就比较麻烦。

Qt图形界面调用system

void Widget::on_pushButton_clicked()
{//system("calc"); //需要头文件:#include <stdlib.h>WinExec("calc", SW_NORMAL); //需要头文件:#include <windows.h>
}void Widget::on_pushButton_2_clicked()
{system("notepad");
}void Widget::on_pushButton_3_clicked()
{system("mmc");
}

示例:

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "stdio.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{system("calc");
}void MainWindow::on_pushButton_2_clicked()
{system("notepad");
}

MFC图形界面调用system

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "stdio.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//打开计算器system("calc");
}void MainWindow::on_pushButton_2_clicked()
{   //打开记事本system("notepad");
}

C语言编译过程

C程序编译步骤

C代码编译成可执行程序经过4步:

1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

2)编译:检查语法,将预处理后文件编译生成汇编文件

3)汇编:将汇编文件生成目标文件(二进制文件)

4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

gcc编译过程

1) 分步编译

预处理:gcc -E hello.c -o hello.i
编  译:gcc -S hello.i -o hello.s
汇  编:gcc -c hello.s -o hello.o
链  接:gcc    hello.o -o hello_elf



一步编译

gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程):

查找程序所依赖的动态库(ldd)(depends.exe软件)

1)Linux平台下,ldd(“l”为字母) 可执行程序:

2)Windows平台下,需要相应软件(Depends.exe):

CPU内部结构与寄存器(了解)(略)

64位和32位系统区别

  • 寄存器是CPU内部最基本的存储单元
  • CPU对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU
  • 如果总线是32位,寄存器也是32位的,那么这个CPU就是32位CPU
  • 有一种CPU内部的寄存器是32位的,但总线是16位,准32位CPU
  • 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
  • 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
  • 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位
  • 64位的软件不能运行在32位的CPU之上

寄存器、缓存、内存三者关系

按与CPU远近来分,离得最近的是寄存器,然后缓存(CPU缓存),最后内存。

CPU计算时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。于是 CPU<—>寄存器<—>内存,这就是它们之间的信息交换。

那为什么有缓存呢?因为如果老是操作内存中的同一址地的数据,就会影响速度。于是就在寄存器与内存之间设置一个缓存。

因为从缓存提取的速度远高于内存。当然缓存的价格肯定远远高于内存,不然的话,机器里就没有内存的存在。

由此可以看出,从远近来看:CPU〈—〉寄存器〈—> 缓存 <—> 内存。

汇编语言(略)

visual studio写c语言步骤(查看反汇编代码)

创建新项目–> c++空项目–>

源文件(右键)–> 添加 --> 新建项

然后在新建的文件中将代码粘贴进去

#include <stdio.h>int main()
{//定义整型变量a, b, cint a;int b;int c;__asm{mov a, 3    //3的值放在a对应内存的位置mov b, 4 //4的值放在a对应内存的位置mov eax, a   //把a内存的值放在eax寄存器add eax, b  //eax和b相加,结果放在eaxmov c, eax  //eax的值放在c中}printf("%d\n", c);//把c的值输出return 0;//成功完成
}

调试 --> 开始执行(不调试)

查看反汇编代码,在这个地方打一个断点(光标移到那行按F9)

按F5开始调试,然后点开调试 --> 窗口 --> 反汇编

然后可以看到将汇编代码反汇编成C的代码(我怎么看到的是这个,跟老师不一样啊?)卧槽,是我搞错了,反汇编是看最终生成的机器语言逆反生成的汇编代码的0-0


上面修改下代码就可以了


反汇编(Disassembly):把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思

Qt creator写c语言步骤

欢迎界面点New新建
点击非Qt项目(Non qt project)点击纯c语言应用(plain c application)
与visual studio不同,qt项目路径和名称不能有中文字符
将main.c remove发现按钮是灰色的
发现文件被锁上了

解锁了还是删不了,算了不删了,可能是cmake的问题

点击新增文件

选择c/c++源文件





然后在这把文件加到后面就好了


同样要想删除main.c只需在cmakelists文件里去掉main.c就好了

然后在里面写入代码,
运行报错No executable specified.:

找到项目路径,把这个删除CMakeLists.txt.user

然后发现还是没什么用,后来发现点击不同地方的run结果是不同的 ,点击下面那个就能运行


但是这个地方还是只有main.c,没有hello.c,重启下qt试试?

重启之后果然就有了,重启是个好东西

注意

集成开发环境IDE

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。

Qt Creator

Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。

快捷键  含义
Ctrl + i   自动格式化代码
Ctrl + /   注释/取消注释
Alt + Enter    自动完成类函数定义
F4  .h 文件和对应.cpp 文件切换
F9  设置断点
F5  调试运行
Ctrl + r   编译,但不调试运行
Ctrl + b   编译,不运行
F10 next调试
F11 step调试

Microsoft Visual Studio

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,所写的目标代码适用于微软支持的所有平台。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。

1) VS常用快捷键

快捷键  含义
Ctrl + k,Ctrl + f 自动格式化代码
Ctrl + k,Ctrl + c 注释代码
Ctrl + k,Ctrl + u 取消注释代码
F9  设置断点
F5  调试运行
Ctrl + F5  不调试运行
Ctrl + Shift + b  编译,不运行
F10 next调试
F11 step调试

2) VS2013的C4996错误

由于微软在VS2013中不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误:


VS建议采用带_s的函数,如scanf_s、strcpy_s,但这些并不是标准C函数。

要想继续使用此函数,需要在源文件中添加以下指令就可以避免这个错误提示:

#define _CRT_SECURE_NO_WARNINGS     //这个宏定义最好要放到.c文件的第一行
#pragma warning(disable:4996)   //或者使用这个

https://www.bilibili.com/video/BV15W411K7k6?p=65&spm_id_from=pageDriver

黑马程序员C语言基础(第三天)相关推荐

  1. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  2. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  3. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  4. 黑马程序员——C语言基础---基础语法

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  5. 黑马程序员--C语言基础之--scanf函数

    ------IOS培训期待与您交流! ------- 写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一. C语言本身并不提供输入输出的语句,输入输出操作 ...

  6. 黑马程序员--C语言基础之--变量、内部函数与外部函数

    ------IOS培训期待与您交流! ------- 一.变量 变量代表着一个有名字的.具有特定属性的一个存储单元,运行期间,变量的值是可以改变的.变量必须先定义,后使用.定义时,指定该变量的名字与类 ...

  7. 黑马程序员--- c语言基础--基本语法

    **第一讲 c语言概述** 一. 计算机和软件常识 1. 计算机运行原理 1) 硬件基本组成:硬盘.内存.CPU 2) 各个部件之间的运作协调 计算机只能识别0和1 1) 0和1组成的指令 2) 0和 ...

  8. 黑马程序员C语言基础(第六天)指针

    https://www.bilibili.com/video/BV1jW411K7v2/?p=70&spm_id_from=pageDriver 文章目录 指针 概述 内存 物理存储器和存储地 ...

  9. 黑马程序员C语言基础(第四天)数据类型

    https://www.bilibili.com/video/BV15W411K7k6?p=65&spm_id_from=pageDriver 文章目录 数据类型 常量与变量 关键字 数据类型 ...

最新文章

  1. web移动开发最佳实践之js篇
  2. C++ COM编程之什么是接口
  3. C++和C#编写调用COM组件
  4. 如何使用分析模型 — 1. 关联图,从乱麻中里出头绪
  5. Smart 3D 切块合并 使用S3C索引 excel表格法
  6. 学了这么久的编程,编程语言创始人你知道几个?
  7. ocr初始化失败怎么办_电脑提示应用程序正常初始化失败如何解决?
  8. Mac无法连接wifi和手机热点 解决方法
  9. 【BZOJ4198】【NOI2015】荷马史诗(贪心,Huffman树)
  10. 【NLP】使用递归神经网络对序列数据进行建模 (Pytorch)
  11. 结构光3D成像原理及应用
  12. 腾讯qlv格式转换mp4为何转换后只有音频
  13. iOS开发入门——基础篇一
  14. Nginx访问限制配置
  15. iPhone6今发售被指已变味 加价倒手成黄牛圈钱工具
  16. net::ERR_ABORTED 404 (Not Found)错误
  17. php 多参数函数,php自定义函数的参数在函数间传递的三种方式详解
  18. 新松机器人产业小镇_总投资18.7亿元的新松浑南智慧产业园,是我国最大的机器人产业化基地。该基地内,...
  19. 基于FPGA的除法器设计
  20. 全网最全音视频媒体流

热门文章

  1. 【学习笔记】32、字符串格式化
  2. 【MM配置】Purchasing 采购配置
  3. SAP保存操作记录CDHDR和CDPOS表,通过修改屏幕字段,查找SAP字段表和字段
  4. java在SAE中使用的相关问题总结
  5. 客户关系管理SAP整体解决方案
  6. ABAP模块P类型详细解释
  7. Function One
  8. 杨国福或夺“麻辣烫第一股”,是否名副其实?
  9. 平台还是代购?海外贸易之争趋近尾声
  10. php yii2.0 读取excel,yii2.0使用excel Gridview读取excel内容