Linux GCC基础用法⑦
在 CentOS 7 系统中使用 GCC 与编写 99 乘法表
一、GCC 简介
GCC(GNU Compiler Collection)是一套功能强大的编程语言编译器,在 CentOS 7 系统中广泛用于编译 C、C++等多种编程语言的程序。它能够将源代码转换为可执行文件,让计算机可以直接运行程序。
二、安装 GCC
在 CentOS 7 系统中,如果尚未安装 GCC,可以通过以下命令使用 yum 包管理器进行安装:
yum install gcc
解释:yum
是 CentOS 系统中用于软件包管理的工具,install
是安装操作,gcc
则是我们要安装的软件包名称。执行此命令后,系统会自动从 CentOS 的软件源下载并安装 GCC 及其相关依赖。
以下是在 CentOS 7 系统中使用 GCC 编写并运行最简单的 “Hello, world!” 程序的完整步骤,适合放在博客中展示:
一、编写源代码
- 首先,打开终端,使用文本编辑器(这里以
vi
为例,你也可以选择nano
等其他编辑器)创建一个名为hello.c
的文件,在终端输入以下命令:
vi hello.c
此时进入 vi
编辑器的命令模式。
- 按下
i
键进入插入模式,然后输入以下 C 语言代码:
#include <stdio.h>int main() {printf("Hello, world!\n");return 0;
}
代码解释如下:
- #include <stdio.h>
:这一行是引入标准输入输出头文件。在 C 语言中,要使用像 printf
这样的标准输入输出函数,就需要包含这个头文件,它为我们提供了相应函数的声明等信息。
- int main()
:这是 C 语言程序的主函数,是整个程序的入口点,程序从这里开始执行。
- printf("Hello, world!\n");
:printf
是一个用于输出信息到标准输出(通常就是终端屏幕)的函数,这里它会输出字符串 "Hello, world!"
,\n
表示换行符,使得输出完信息后进行换行操作。
- return 0;
:在 main
函数的末尾,return
语句用于返回一个整数值给操作系统,表示程序的结束状态。通常返回 0
表示程序正常结束。
- 编写完代码后,按下
Esc
键回到命令模式,然后输入:wq
保存文件并退出vi
编辑器。
二、使用 GCC 编译程序
在包含 hello.c
文件的目录下(可以通过 pwd
命令查看当前所在目录),使用以下 GCC 命令进行编译:
gcc hello.c -o hello
解释:
- gcc
是编译器命令,用于调用 GCC 编译器来处理我们的源文件。
- hello.c
是要编译的源文件名称,也就是我们刚刚编写的包含 “Hello, world!” 代码的那个文件。
- -o
选项用于指定输出文件的名称,这里我们将生成的可执行文件命名为 hello
。如果省略 -o
选项,默认会生成一个名为 a.out
的可执行文件。
三、运行程序
- 检查执行权限
编译后生成的可执行文件hello
,默认情况下可能没有执行权限。可以通过ls -l
命令查看其权限信息,像这样:
ls -l hello
输出结果可能类似如下形式(权限部分示例):
-rw-r--r--. 1 user user 8528 Dec 11 12:00 hello
这里开头的 -rw-r--r--
表示文件的权限,第一个字符 -
表明这是一个普通文件,后面三组 rwx
(这里是 rw-
、r--
、r--
)分别对应文件所有者、所属组以及其他用户的读(r
)、写(w
)、执行(x
)权限。可以看到当前示例中并没有执行权限(x
)标志,所以需要添加执行权限才能顺利运行这个文件。
- 添加执行权限
使用chmod
命令来为文件添加执行权限,有以下两种常用方式:- 使用数字形式修改权限:
命令格式为chmod [数字权限值] [文件名]
,数字权限值是通过将所有者、所属组、其他用户的权限对应的数字相加得到的。r
(读权限)对应数字4
,w
(写权限)对应数字2
,x
(执行权限)对应数字1
。比如要给所有者、所属组、其他用户都添加执行权限,对应的权限值就是755
(所有者rwx
即4 + 2 + 1 = 7
,所属组r-x
即4 + 0 + 1 = 5
,其他用户r-x
即4 + 0 + 1 = 5
),命令如下:
- 使用数字形式修改权限:
chmod 755 hello
- **使用符号形式修改权限**:
命令格式为 chmod [用户类型][操作符号][权限字符] [文件名]
,例如给所有者添加执行权限,可以这样操作:
chmod u+x hello
这里 u
表示所有者(user
),+
是添加权限的操作符号,x
表示执行权限。
- 运行可执行文件
在确保文件有了执行权限后,就可以在终端中通过以下方式运行它(假设当前所在目录就是包含hello
文件的目录,如果不在该目录,需要先切换到相应目录):
./hello
解释:./
表示当前目录,这是因为 Linux 系统在查找可执行文件时,默认不会在当前目录查找(出于安全等考虑),所以需要明确指定当前目录下的可执行文件来运行。运行上述命令后,你就能在终端看到输出的 "Hello, world!"
字符串了。
三、使用 vi 编写 99 乘法表程序
- 打开终端,输入
vi multitable.c
命令创建并打开一个名为multitable.c
的文件。此时进入 vi 编辑器的命令模式。 - 按下
i
键进入插入模式,开始编写代码:
#include <stdio.h>int main() {int i, j;for (i = 1; i <= 9; i++) {for (j = 1; j <= i; j++) {// 输出乘法表达式和结果,%d 表示整数占位符printf("%d x %d = %d\t", j, i, i * j);}// 换行,用于输出下一行乘法表printf("\n");}return 0;
}
解释:
- #include <stdio.h>
:引入标准输入输出头文件,这样我们就可以使用printf
函数进行输出。
- int main()
:程序的主函数,是程序的入口点。
- int i, j;
:定义两个整型变量i
和j
,用于循环计数。
- 外层for
循环for (i = 1; i <= 9; i++)
:控制乘法表的行数,从 1 到 9。
- 内层for
循环for (j = 1; j <= i; j++)
:控制每行乘法表的列数,列数与当前行数相等。例如,当i = 3
时,内层循环会执行 3 次,输出 1 x 3 = 3、2 x 3 = 6、3 x 3 = 9。
- printf("%d x %d = %d\t", j, i, i * j);
:按照指定格式输出乘法表达式和结果,\t
表示制表符,用于对齐输出。
- printf("\n");
:在内层循环结束后换行,准备输出下一行乘法表。
3. 编写完代码后,按下Esc
键回到命令模式,输入:wq
保存文件并退出 vi 编辑器。
四、使用 GCC 编译 99 乘法表程序
在包含multitable.c
文件的目录下,使用以下命令进行编译:
gcc multitable.c -o multitable
解释:gcc
是编译器命令,multitable.c
是要编译的源文件,-o
选项用于指定输出文件的名称,这里将生成的可执行文件命名为multitable
。
五、运行程序
- 权限相关说明:在 Linux 系统(包括 CentOS 7)中,默认情况下新生成的可执行文件可能没有执行权限。可以通过
ls -l
命令查看文件的详细信息,例如对编译后的multitable
文件查看权限信息:
ls -l multitable
输出结果可能类似如下形式(权限部分示例):
-rw-r--r--. 1 user user 8528 Dec 11 12:00 multitable
其中开头的-rw-r--r--
表示文件的权限,第一个字符-
说明这是一个普通文件,后面的三组rwx
(这里是rw-
、r--
、r--
)分别对应文件所有者、所属组以及其他用户的读(r
)、写(w
)、执行(x
)权限。可以看到当前示例中并没有执行权限(x
)标志,所以需要添加执行权限才能运行这个文件。
2. 添加执行权限:使用chmod
命令来为文件添加执行权限,常用的方式有以下两种:
- 使用数字形式修改权限:
命令格式为chmod [数字权限值] [文件名]
,数字权限值是通过将所有者、所属组、其他用户的权限对应的数字相加得到的。r
(读权限)对应数字4
,w
(写权限)对应数字2
,x
(执行权限)对应数字1
。比如要给所有者、所属组、其他用户都添加执行权限,对应的权限值就是755
(所有者rwx
即4 + 2 + 1 = 7
,所属组r-x
即4 + 0 + 1 = 5
,其他用户r-x
即4 + 0 + 1 = 5
),命令如下:
chmod 755 multitable
- **使用符号形式修改权限**:
命令格式为chmod [用户类型][操作符号][权限字符] [文件名]
,例如给所有者添加执行权限,可以这样操作:
chmod u+x multitable
这里u
表示所有者(user
),+
是添加权限的操作符号,x
表示执行权限。
3. 运行可执行文件:在确保文件有了执行权限后,就可以在终端中通过以下方式运行它(假设当前所在目录就是包含multitable
文件的目录,如果不在该目录,需要先切换到相应目录):
./multitable
解释:./
表示当前目录,这是因为 Linux 系统在查找可执行文件时,默认不会在当前目录查找(出于安全等考虑),所以需要明确指定当前目录下的可执行文件来运行。这样操作后,就可以看到终端中输出了我们期望的99
乘法表内容了,如下所示:
1 x 1 = 1
1 x 2 = 2 2 x 2 = 4
1 x 3 = 3 2 x 3 = 6 3 x 3 = 9
1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16
1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49
1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64
1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81
相关文章:
Linux GCC基础用法⑦
在 CentOS 7 系统中使用 GCC 与编写 99 乘法表 一、GCC 简介 GCC(GNU Compiler Collection)是一套功能强大的编程语言编译器,在 CentOS 7 系统中广泛用于编译 C、C等多种编程语言的程序。它能够将源代码转换为可执行文件,让计算…...
PyTorch 切片运算 (Slice Operator)
PyTorch 切片运算 {Slice Operator} 1. [:, -1, :]2. [:, [-1], :]References 1. [:, -1, :] https://github.com/karpathy/llama2.c/blob/master/model.py import torchlogits torch.arange(1, 16) print("logits.shape:", logits.shape) print("logits:\n&…...
SpringSecurity Oauth2 -账号密码实现多因子身份认证
1. 密码策略问题 CREATE TABLE t_storage (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 自增主键,nameSpace varchar(64) NOT NULL COMMENT 隔离字段,groupId varchar(128) NOT NULL COMMENT 分组,比如不同app,dataId varchar(64) NOT NULL COMMENT 数据存储id…...

【CSS in Depth 2 精译_071】11.4 思考字体颜色的对比效果 + 11.5 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…...

Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)
文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器(在游戏内对新的事件进行注册)2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…...

趣味编程:猜拳小游戏
1.简介 这个系列的第一篇以猜拳小游戏开始,这是源于我们生活的灵感,在忙碌的时代中,我们每个人都在为自己的生活各自忙碌着,奔赴着自己所走向的那条路上,即使遍体鳞伤。 但是,生活虽然很苦,也不…...

软件工程 概述
软件 不仅仅是一个程序代码。程序是一个可执行的代码,它提供了一些计算的目的。 软件被认为是集合可执行的程序代码,相关库和文档的软件。当满足一个特定的要求,就被称为软件产品。 工程 是所有有关开发的产品,使用良好定义的&…...

CountDownLatch阻塞后countDown未执行会如何?
背景 某项目封装了 Kafka 消费者 API,根据传递的消费者线程数,创建 N 个消费者线程同时消费对应 topic 的数据,并在线程启动后收集到全局列表中,方便在程序调用 stop 流程时逐个停止。 主控类在创建 Kafka 消费线程时使用了 Cou…...
k8s,operator
相对更加灵活和编程友好的管理“有状态应用”的解决方案,它就是:Operator 会议一下有状态应用: 比如数据库集群,数据挂载需要有顺序维护拓扑关系的应用 使用statefulSet这个对象来描述。 CRD又是什么? Operator的工作…...

使用 pyperclip 进行跨平台剪贴板操作
简介:pyperclip 是一个轻量级的 Python 库,支持在不同操作系统(Windows、macOS、Linux)中进行剪贴板的复制和粘贴。这个库的设计简单易用,非常适合需要频繁进行文本复制粘贴操作的场景。 历史攻略: 使用f…...
20 设计模式之职责链模式(问题处理案例)
一、什么是职责链模式 职责链模式是一种行为型设计模式,它允许将请求沿着处理者的链进行传递,直到有一个处理者能够处理它为止。换句话说,它将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求,从而避免了将…...
SpringBoot3集成MybatisPlus3和knife4j(swagger3兼容增强版)
针对Swagger2规范和OpenAPI3规范的说明: 在Spring Boot框架中,Knife4j对于服务端将Spring的开放接口解析成Swagger2或者OpenAPI3规范的框架,也是依赖的第三方框架组件。说明如下: Swagger2规范:依赖Springfox项目,该项目目前几乎处于停更状态,但很多老项目依然使用的是该…...

【MIT-OS6.S081作业1.3】Lab1-utilities primes
本文记录MIT-OS6.S081 Lab1 utilities 的primes函数的实现过程 文章目录 1. 作业要求primes (moderate)/(hard) 2. 实现过程2.1 代码实现 1. 作业要求 primes (moderate)/(hard) Write a concurrent version of prime sieve using pipes. This idea is due to Doug McIlroy, in…...

游戏引擎学习第35天
开场介绍 今天的任务是继续改进一个虚拟的瓦片地图系统,使其适合处理更大的世界。我们希望这个系统能管理大范围的游戏世界,其中包含按需存储的小区域。昨天,我们介绍了“内存区域”的概念,用于管理持久性存储。我们计划今天继续…...
learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)
1.父子组件u-search (1)父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…...

设置IMX6ULL开发板的网卡IP的两种方法(临时生效和永久有效两种方法)
设置开发板网卡的IP,有两种方法。 方法一:临时生效 第一种方式是临时设置,只有本次有效,重启后又要重新设,命令为: ifconfig eth0 192.168.5.9设置成功后可以使用ifconfig命令来查看已设置的 IP 地址。 …...
流量转发利器之Burpsuite概述(1)
目录 一、Burpsuite Burp Suite Spider 的主要特点: 在 Burp Suite 中使用 Spider: Spider 的用例: 限制: 声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技…...

Transformer入门(6)Transformer编码器的前馈网络、加法和归一化模块
文章目录 7.前馈网络8.加法和归一化组件9.组合所有编码器组件构成完整编码器 7.前馈网络 编码器块中的前馈网络子层如下图所示: 图1.32 – 编码器块 前馈网络由两个带有ReLU激活函数的全连接层组成。全连接层(Fully Connected Layer)有时也…...
element-plus中的resetFields()方法
resetFields()确实是Element Plus中的方法,该方法主要用于重置表单,将其值重置为初始值,并移除校验结果。以下是对该方法的详细解释: 一、resetFields方法的作用 在Vue3结合Element Plus开发时࿰…...

【过滤器】.NET开源 ORM 框架 SqlSugar 系列
目录 0、 过滤器介绍 1、表过滤器 (推荐) 1.1 手动添加过滤器 1.2 禁用、清空、备份和还原 1.3 联表查询设置 1.4 动态添加 2、修改和删除用过滤器 2.1 局部设置 2.2 全局设置 (5.1.4.62) 3、子查询用过滤器 4、联表过滤…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...