C语言基础(一)—— C语言概述(领域、编译过程、IDE)

news2025/1/10 20:53:38

1. 什么是C语言

语言是人和人交流,C语言就是人和计算机交流的一种语言

2. 为什么要学习C语言

2.1 C语言特点

优点:
代码量小
执行速度快
功能强大
编程自由

缺点:
写代码实现周期长
可移植性较差
过于自由,经验不足易出错
对平台库依赖较多

2.2 学习C语言理由

2.3 C语言应用领域

C语言的应用极其广泛,从网站后台,到底层操作系统,从多媒体应用到大型网络游戏,均可使用C语言来开发:

  • C语言可以写网站后台程序

  • C语言可以专门针对某个主题写出功能强大的程序库

  • C语言可以写出大型游戏的引擎

  • C语言可以写出另一个语言来

  • C语言可以写操作系统和驱动程序,并且只能用C语言编写

  • 任何设备只要配置了微处理器,就都支持C语言。从微波炉到手机,都是由C语言技术来推动的

2.4 C语言的简洁

C语言仅有32个关键字9种控制语句34种运算符,却能完成无数的功能:

2.5 学习C语言的常见困惑

3 第一个C语言程序:HelloWorld

3.1 编写C语言代码:hello.c

#include <stdio.h>

int main()
{
    //这是第一个C语言代码 
    printf("hello world\n");
    return 0;
}

C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c

3.2 通过gcc编译C代码

3.2.1 gcc编译器介绍

编辑器(如vi、记事本)是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行
编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。

gcc(GNU CompilerCollection,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++编译常用选项说明:

选项

含义

-o file

指定生成的输出文件名为file

-E

只进行预处理

-S(大写)

只进行预处理和编译

-c(小写)

只进行预处理、编译和汇编

3.2.2 Windows平台下gcc环境配置

windows命令行界面下,默认是没有gcc编译器,我们需要配置一下环境。由于安装了QtQt是一个集成开发环境,内部集成gcc编译器,配置一下环境变量即可使用gcc。

参考文章:QT环境变量配置

3.2.3 Windows平台下编译代码

3.3 代码分析

3.3.1 include头文件包含

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

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

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

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

3.3.2 main函数

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

  • main函数是C语言程序的入口,程序是从main函数开始执行。

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

  • {}叫代码块,一个代码块内部可以有一条或者多条语句

  • C语言每句可执行代码都是";"分号结尾

  • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的

  • 所有的可执行语句必须是在代码块里面

3.3.4 注释

  • //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读

  • /**/叫块注释

  • 块注释是C语言标准的注释方法

  • 行注释是从C++语言借鉴过来的

3.3.5 printf函数

  • printf是C语言库函数,功能是向标准输出设备输出一个字符串

  • printf(“hello world\n”);//\n的意思是回车换行

3.3.6 return语句

  • return代表函数执行完毕,返回return代表函数的终止

  • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写

  • 在main函数中return 0代表程序执行成功return -1代表程序执行失败

  • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式

4. system函数

4.1 system函数的使用

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

功能:在已经运行的程序中执行另外一个外部程序
参数:外部可执行程序名字
返回值:
    成功:0
    失败:任意数字

示例代码:

#include <stdio.h>
#include <stdlib.h>

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

    return 0;
}

5. C语言编译过程

5.1 C程序编译步骤

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

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

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

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

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

5.2 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

选项

含义

-E

只进行预处理

-S(大写)

只进行预处理和编译

-c(小写)

只进行预处理、编译和汇编

-o file

指定生成的输出文件名为 file

文件后缀

含义

.c

C 语言文件

.i

预处理后的 C 语言文件

.s

编译后的汇编文件

.o

编译后的目标文件

2) 一步编译

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

5.3 查找程序所依赖的动态库

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

6. CPU内部结构与寄存器

6.1 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之上

6.2 寄存器名字(了解)

8位

16位

32位

64位

A

AX

EAX

RAX

B

BX

EBX

RBX

C

CX

ECX

RCX

D

DX

EDX

RDX

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

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

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

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

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

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

7. 集成开发环境IDE

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

7.1 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调试

7.2 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)    //或者使用这个

8. 汇编语言

8.1 VS中C语言嵌套汇编代码(了解)

#include <stdio.h>

int main()
{
    //定义整型变量a, b, c
    int a;
    int b;
    int c;

    __asm
    {
        mov a, 3    //3的值放在a对应内存的位置
        mov b, 4    //4的值放在b对应内存的位置
        mov eax, a    //把a内存的值放在eax寄存器
        add eax, b    //eax和b相加,结果放在eax
        mov c, eax    //eax的值放在c中
    }
    
    printf("%d\n",  c);//把c的值输出

    return 0;//成功完成
}

8.2 VS反汇编

#include <stdio.h>

int main()
{
    //定义整型变量a, b, c
    int a;
    int b;
    int c;

    a = 3;
    b = 4;
    c = a + b;
    
    printf("%d\n",  c);//把c的值输出

    return 0;//成功完成
}
  1. 设置断点F9

  1. 选择反汇编按钮

  1. 根据汇编代码分析程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hystrix执行时内部原理

Hystrix最基本的支持高可用的技术资源隔离和限流。创建command,执行这个command,配置这个command对应的group和线程池。这里分析一下开始执行这个command,调用了这个command的execute()方法之后,Hystrix底层的执行流程和步骤以及原理是什么。整个8大步骤的流程图: 步骤一:…

Hive(6):数据定义语言(DDL)案例

1 原生数据类型案例 文件archer.txt中记录了相关信息&#xff0c;内容如下所示&#xff0c;其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件。 1 后羿 5986 1784 396 336 remotely archer 2 马可波罗 5584 200 362 344 remotely archer 3 鲁班七号 5989 1756 4…

JVM笔记(5)—— 运行时数据区—— 方法区

上一篇&#xff1a;JVM笔记&#xff08;4&#xff09;—— 运行时数据区——堆空间 一、栈、堆、方法区的交互关系 进程运行过程中&#xff0c;在方法中创建对象时通过方法区中的类型信息在堆中创建对应的对象&#xff0c;对象中又存有指向方法区中对应类型信息的指针&#xf…

Python采集热搜评论数据,制作词云分析,又是吃瓜的一天

前言 最近微博上的爆的热搜是不少啊&#xff0c;咳咳&#xff0c;23年1月31号记汪峰旷工一次 之前有营销号预言23年的娃瓜 已经爆出来一个了 好像是说还有两个来着 也不知道是谁的娃~ 现在已经没有什么可以震惊到我的了 胡歌都有娃了 彭于晏抓紧吧 有点点的无聊 就来用Pytho…

MySQL事件

文章目录事件介绍事件调度查询事件调度状态开关事件调度(临时)开关事件调度(永久)事件使用创建事件语法子句分析执行计划子句事件主体子句查询事件修改事件删除事件事件介绍 MySQL事件(event)是根据指定时间表执行的任务&#xff0c;称为计划事件。事件包含一个或多个SQL语句的…

【刷题】二进制求和

当你觉得小学二年级教的的竖式学会了以后&#xff0c;此题又是一记重击。 目录 前言 一、题目 二、找规律 三、思想 1.位数相同 2.位数不同 3.注意事项 四、具体实现 总结 前言 同上次做过的的二进制求和相似&#xff08;按位异或求出的是无进位和&#xff0c;按位与求…

大数据技术架构(组件)14——Hive:掩码函数杂项函数

1.4.8、掩码函数1.4.8.1、mask-->Hive2.1.01.4.8.12、mask_first_n->Hive2.1.01.4.8.13、mask_last_n -->Hive2.1.01.4.8.14、mask_show_first_n-->Hive2.1.01.4.8.15、mask_show_last_n -->Hive2.1.01.4.8.16、mask_hash -->Hive2.1.0支持版本返回值类型函数…

让你深夜emo的“网抑云”,是如何做产品设计的?

网易云音乐作为国内首个以“歌单”为核心架构的音乐APP&#xff0c;有的人喜欢它的热评&#xff0c;有的人却觉得它的版权太少&#xff0c;虽然网易云音乐不是曲库最丰富的听歌软件&#xff0c;但绝对是听歌软件里情感体验最好的。 我很好奇它具有什么力量&#xff0c;能够使用…

ReentrantReadWriteLock可重入读写锁

目录 读写锁&#xff1a; 锁降级 锁饥饿&#xff1a; 读写锁&#xff1a; 定义&#xff1a;一个资源能够被多个读线程访问&#xff0c;或者被一个写线程访问&#xff0c;但是不能同时存在读写线程。 特点:读写互斥&#xff0c;写锁独占&#xff0c;读读可共享,读没有完…

分布式学习第三天—远程调用和网关

Feign远程调用 Feign的介绍 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送 Feign远程调用的使用步骤 1.引入依赖 在子模型服务的pom文件中引入feign的依赖&#xff1a; &l…

【计网】入门知识

一些基本认识网络传输基本要素&#xff1a;网络编程&#xff1a;python的网络编程方式TCP和UDP一些编程技巧socket实现TCP通信网络传输基本要素&#xff1a; 有连接通道、传输字节数据、输入输出遵守一样的协议 网络编程&#xff1a; CS&#xff08;QQ下载客户端&#xff09…

linux防火墙究竟如何使用?iptables的原理与简单应用

1. 什么是防火墙&#xff1f; 在计算机体系中&#xff0c;防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描&#xff0c;这样能够过滤掉一些攻击&#xff0c;以免其…

Vulkan 理解Vertex Input Description

此文为个人记录&#xff0c;感兴趣直接看https://zhuanlan.zhihu.com/p/450157594 首先&#xff0c;一个顶点的结构体 struct Vertex {glm::vec3 pos;glm::vec3 color; }CPU端给出顶点数据 const std::vector<Vertex> vertices {{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},…

Allegro如何显示盲埋孔钻孔所在层面操作指导

Allegro如何显示盲埋孔钻孔所在层面操作指导 在用Allegro做PCB设计的时候,涉及盲埋孔设计的时候,需要实时看到盲埋孔是打在哪层到哪层,如下图 实时显示了盲埋孔是从哪层到哪层的,比如1-3,3-6等等 如何显示,具体操作如下 选择Setup选择design Parameters

[golang Web开发] 3.golang web开发:处理请求

简介 Go语音的net/http包提供了一系列用于表示HTTP报文的结构,可以使用它处理请求和发送响应,其中Request结构代表了客户端发送的请求报文,下面是Request讲解 type Request struct {// Method指定HTTP方法&#xff08;GET、POST、PUT等&#xff09;。对客户端&#xff0c;"…

linux系统加固

linux安全加固 linux系统安全包括用户安全、权限安全、文件安全 从那些方面进行加固 身份鉴别 访问控制 安全审计 资源控制 入侵防范 在linux当中一切皆文件 身份鉴别 /etc/login.defs 文件功能 查看密码策略 /etc/login.defs文件定义了与/etc/passwd和/etc/shadow配套的用户限…

VOIP创建

一、介绍VOIP的推送证书的创建方式和普通的证书的创建方式基本一致。二、步骤首先需要生成证书签名的请求文件CerSingingRequest&#xff0c;打开钥匙串应用&#xff0c;点击钥匙串访问->证书助理->从证书颁发机构请求输入电子邮件和名称后保存到本地3.在developer.apple…

服务器防火墙 配置端口号

作为前端的我头次做运维的事情。 现在服务器是的默认端口好像只有80&#xff0c;443&#xff0c;其余端口都需要我们配置 域ping 通了&#xff0c;以为服务配置好了可以撸起袖子加油干&#xff0c;但是 访问公司的服务 出错了400 访问公司的服务xxx.168.30.xxx:8081&#xff…