CS50x 2024 - Lecture 2 - Arrays

00:00:00 - Introduction

00:01:01 - Story Time

00:06:03 - Compiling

make本身并不是编译器,实际上是一个自动运行编译器的程序,如c语言的clang

clang -o hello hello.c
src/ $ clang -o hello hello_world.c 
/usr/bin/ld: /tmp/hello_world-67f514.o: in function `main':
hello_world.c:(.text+0x1d): undefined reference to `get_string'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果使用第三方库,不一定是c语言附带的库,例如cs50的库,那么必须告诉编译器想要使用什么库,不仅包括头文件,还包括附加命令

clang -o hello hello.c -lcs50

make在你不知道的情况使用了-o,和-lcs50

运行clang时(编译),会发生四种不同的事情

preprocessing  //预处理就是将#include包含的行转换为文件中的任何底层原型
compiling   //编译将源代码转为汇编语言
assembling  //汇编将汇编语言转换为机器语言
linking  //hello.c stdio.c cs50.c 是分别单独编译的,链接将他们组合为一个最终文件

Clang和GCC是两个广泛使用的编译器,它们都可以编译C、C++、Objective-C等语言的代码,但它们在设计、性能、兼容性和错误报告等方面有一些不同。

设计和目标

  • Clang 是基于LLVM(Low Level Virtual Machine)项目的一部分,设计目标是提供一个基于LLVM的C语言族编译器,强调编译速度和内存使用效率,以及生成的代码的性能。Clang设计为易于使用和易于集成到其他项目中,提供了丰富的错误和警告信息,旨在提高开发效率。
  • GCC(GNU Compiler Collection)是一个开源编译器集合,支持多种编程语言。GCC最初作为GNU操作系统的一部分开发,目标是提供一个自由软件的编译器。GCC着重于优化和支持多种架构,包括x86、ARM、MIPS等。

性能和优化

  • ClangGCC 在性能方面通常相当接近,尽管在不同的测试和不同版本中,一个可能比另一个表现得更好。Clang通常编译速度更快,尤其是对于C++代码,而GCC在某些优化方面可能更先进,尤其是在生成高度优化的代码方面。

错误报告

  • Clang 的错误报告通常被认为比GCC更友好和更清晰。Clang致力于提供易于理解的错误消息和诊断信息,包括错误位置和可能的解决方案建议。
  • GCC 近年来也在改进其错误消息的清晰度和有用性,但Clang在这方面通常被认为具有优势。

兼容性

  • Clang 致力于与GCC兼容,尽量支持GCC的扩展和行为,以便开发者可以无缝迁移代码。
  • GCC 作为一个更早期的项目,有自己的扩展和特性,这些在某些情况下可能导致与Clang的兼容性问题。

开发者生态

  • Clang 由于其设计和易用性,被许多现代项目和开发环境采用,包括Xcode和许多基于LLVM的工具。
  • GCC 长期以来一直是Linux和开源社区的主力编译器,具有广泛的用户基础和成熟的技术支持。

总结

选择Clang还是GCC取决于特定的项目需求、目标平台和开发者偏好。对于追求编译速度和更好的错误报告的项目,Clang可能是更好的选择。对于需要特定优化或在特定架构上运行的项目,GCC可能更合适。两者都是强大的工具,能够满足现代软件开发的需求。

00:28:40 - Debugging

当你没有复杂工具调试时,printf是你的朋友,但是会增加复杂性

更强大的工具:debugger,将会节省大量时间
debug50,可以向cs50 duck询问不理解的概念

00:47:27 - Memory

00:52:37 - scores.c

00:57:39 - Arrays

数组是内存中背靠背的值序列
01:13:59 - Strings
其实就是字符数组,如果一个字节中全为0则意味着字符串在这里结束
在这里插入图片描述
在这里插入图片描述
\0称为NUL,表示终止字符的0字节

在这里插入图片描述

01:33:12 - String Length

#include <stdio.h>
#include <cs50.h>int get_length(string s);
int main() {string name = get_string("your name?");printf("%i\n",get_length(name));}int get_length(string s) {int n = 0;while (s[n] != '\0') {n++;}return n;
}

运用string library

#include <stdio.h>
#include <cs50.h>
#include <string.h>int main() {string name = get_string("your name?");printf("%lu\n",strlen(name));}

01:44:33 - uppercase.c

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>int main() {string s = get_string("Before: ");printf("After: ");for (int i = 0, n = strlen(s); i < n; i++) {printf("%c", toupper(s[i]));}printf("\n");
}

01:50:05 - Command-line Arguments

#include <stdio.h>int main(int argc, string argv[]) {}

argcargv 是在C语言(以及一些其他编程语言,如C++)中用于处理命令行参数的两个变量,它们在程序启动时由操作系统传递给程序。这两个变量通常在程序的主函数main的参数列表中定义,它们代表了:

  • argc(Argument Count的缩写)表示命令行参数的数量。这个数量包括程序本身的名称,所以argc的值至少为1。

  • argv(Argument Vector的缩写)是一个指向字符串数组的指针,这个数组存储了具体的命令行参数。argv[0]是程序的名称,argv[1]是第一个参数,以此类推,直到argv[argc-1]argv[argc]是一个空指针(NULL),用于标识数组的结束。

通过这两个变量,程序可以接收和处理用户在命令行中输入的参数,使程序的行为可以根据这些参数进行调整。例如,用户可以通过命令行参数指定文件路径、配置选项等信息。

简单的示例代码如下:

#include <stdio.h>int main(int argc, char *argv[]) {printf("Program name: %s\n", argv[0]);printf("Number of arguments: %d\n", argc-1);for(int i = 1; i < argc; i++) {printf("Argument %d: %s\n", i, argv[i]);}return 0;
}

在这个例子中,如果程序名为example,并且被调用时使用了两个参数file.txt-option,那么argc的值将是3,argv数组将包含["example", "file.txt", "-option"]

01:57:58 - Cowsay
cowsay是一个在命令行界面上用于生成由ASCII字符画的牛(或其他动物)所“说出”的文本的程序。它通常用于在命令行会话中添加一点幽默或个性化元素。用户可以通过输入一个字符串来创建一个由牛头围绕的文本气泡,好像是这只牛在“说”这段文字。

cowsay最初是由Tony Monroe以Perl语言编写的,并且随时间发展,它已经被移植到了多种操作系统上。除了默认的牛图案,cowsay还支持多种其他动物和角色的图案,这些图案通常通过修改程序的配置文件或使用特定的命令行选项来选择。

使用cowsay非常简单,基本的命令格式如下:

cowsay [options] text

这里的text是你希望“牛”说的话,[options]可以是用来改变输出字符画的各种选项,比如选择不同的角色(例如羊、龙、鬼等)。

cowsay不仅是一个有趣的小工具,也体现了开源社区的幽默感和创意。它可通过各种Linux发行版的包管理器安装,也可在其他操作系统上通过兼容层或移植版本使用。

01:59:44 - Exit Status

我们的程序默认是以0返回值退出
echo $? 可以看到秘密的返回值

#include <stdio.h>
#include <cs50.h>int main(int argc, string argv[]) {if (argc != 2) {printf("missing value in command line\n");return 1;}printf("hello ,%s\n",argv[1]);return 0;
}

02:05:48 - Cryptography

在这里插入图片描述
key通常是很多位的
凯撒密码

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

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

相关文章

python+django高校教务选课成绩系统v0143

系统主要实现了以下功能模块&#xff1a; 本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并…

Minecraft的红石教程之电梯

一.前言 我记得是上初中的时候&#xff0c;就看到了这类电梯。现在我在看现在这类电梯的相关视频&#xff0c;大多是盗用创意未能领会其中的红石运作规律&#xff0c;于是我就删繁就简写了这篇。 二.步骤 1.材料 粘性活塞&#xff0c;黏液块&#xff0c;红石&#xff0c;红…

什么是CDR数字音频广播

一、什么是数字音频广播 CDR(China DigilalRadio)&#xff0c;即中国数字音领广播&#xff0c;是运用广播数字化技术&#xff0c;通过对音领信号进行信源编码、信道编码和载波调制传输&#xff0c;来实现数字音频广播业务和数据业务的播出。CDR与传统的FM调频广播相比&#xff…

SAP-PP-01-004物料主数据MRP视图参数

一、MRP1 MRP组 系统运行的 mrp 控制参数的组别。包含物料主数据中的一些 MRP 参数字段及工厂运行 MRP 控制设置参数&#xff0c;例如策略组、消耗模式、重计划期间、计划区间、计划时界、BOM 展开、计划订单转换的采购申请&#xff08;PR&#xff09;类型等。 工厂特定的物料…

你的立身之本是什么?

去年发生的一切&#xff0c;大到疫情、政治经济形势、行业的萎靡和震荡&#xff0c;小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们&#xff1a; 当冲击到来的时候&#xff0c;它是不会提前跟你打招呼的。 接下来的10年&#xff0c;我们所面临的不确定性&#xff0c;比起…

Mac电脑到手后的配置

一、Homebrew 1、Homebrew安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 桌面的Old_Homebrew文件夹&#xff0c;没有你需要的可以删除。 2、Homebrew卸载 /bin/zsh -c "$(curl -fsSL https://gitee.com/c…

C语言函数(三):数组和函数实现扫雷游戏

目录 1.扫雷游戏的分析和设计1.1.扫雷游戏的功能说明1.2.游戏的分析与设计1.2.1 数据结构的分析1.2.2 文件结构设计 2.扫雷游戏的代码实现 1.扫雷游戏的分析和设计 1.1.扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩游戏或者退出游戏扫雷的棋盘…

ssm+vue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的医药垃圾分类管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

【Linux】Linux下的基本指令

Linux下的基本指令 Linux 的操作特点&#xff1a;纯命令行ls 指令文件 pwd命令Linux的目录结构绝对路径 / 相对路径&#xff0c;我该怎么选择&#xff1f; cd指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令rm 指令&#xff08;重要&#xff09;man指令&#xff…

RocketMQ(二):领域模型(生产者、消费者)

1 生产者&#xff08;Producer&#xff09; 本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。 1.1 定义 生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。 生产者通常被集成在业务系统中&#xff0c;将业务消息按照要…

【MySQL】字符串函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

kali最新最简单安装

之前都是用iso镜像文件的 今年好多东西都删库了&#xff0c;所有还是要主要资源的保存 去官网找下载 一般来说都是用虚拟机的 下载完会是一个压缩文件&#xff0c; 解压&#xff0c;然后操作之前需要先下载虚拟机 打开方式用虚拟机打开 kali就按装好了

Spring Boot3统一结果封装

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 封装目的 常用格式 定义返回结果枚举类 定义返回结果封装类 对返回结果封装 测试封装 前置条件 已…

「daily updating」k3s + openfaas serverless bench 踩坑指南持续更新中

OpenFaas从入门到实战 – 踩坑指南 &#xff5c; k3dOpenFaas | deploy your first python function https://blog.alexellis.io/first-faas-python-function/ https://docs.openfaas.com/deployment/kubernetes/ 搭建环境&#xff1a;第一种方法失败&#xff0c;第二种方法…

【SpringBootStarter】自定义全局加解密组件

【SpringBootStarter】 目的 了解SpringBoot Starter相关概念以及开发流程实现自定义SpringBoot Starter(全局加解密)了解测试流程优化 最终引用的效果&#xff1a; <dependency><groupId>com.xbhog</groupId><artifactId>globalValidation-spring…

[职场] 大厂群面的基本题型 #学习方法#其他

大厂群面的基本题型 大厂群面的基本题型 群面&#xff0c;又叫做“无领导小组面试”。历年来是企业校招时&#xff0c;进行大批量刷人的有效方法。流行于互联网、快消、银行、四大等多个行业。因为难度大、情况复杂、淘汰率高&#xff0c;又被称为“死亡面试”。 无领导小组…

CSP-202012-2-期末预测之最佳阈值

CSP-202012-2-期末预测之最佳阈值 【70分思路】 本题的难点还是时间复杂度&#xff0c;暴力枚举会导致时间超限。对于每一个可能的阈值theta&#xff0c;代码都重新计算了整个predict数组&#xff0c;统计预测正确的数目&#xff0c;因为有两个嵌套的循环&#xff0c;使得时间…

计算机网络之一

目录 1.因特网概述 1.1网络、互连网&#xff08;互联网&#xff09;和因特网 1.2.因特网发展的三个阶段 1.3基于ISP的三层架构的因特网 1.4.因特网的组成 2.三种交换方式 2.1电路交换 2.2分组交换 1.因特网概述 1.1网络、互连网&#xff08;互联网&#xff09;和因特网…

Git分支常用指令

目录 1 git branch 2 git branch xx 3 git checkout xx 4 git checkout -b xx 5 git branch -d xx 6 git branch -D xx 7 git merge xx(含快进模式和冲突解决的讲解) 注意git-log: 1 git branch 作用&#xff1a;查看分支 示例&#xff1a; 2 git branch xx 作用&a…

数据结构——5.5 树与二叉树的应用

5.5 树与二叉树的应用 概念 结点的权&#xff1a;大小可以表示结点的重要性 结点的带权路径长度&#xff1a;从树的根到该结&#xff0c;的路径长度&#xff08;经过的边数&#xff09;与该结点权的乘积 树的带权路径长度&#xff1a;树中所有叶结点的带权路径长度之和(WPL) …