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://xiahunao.cn/news/2776188.html

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

相关文章

【VTKExamples::PolyData】第二十四期 InterpolateTerrain

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例InterpolateTerrain,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. InterpolateTerrain 输出: Interp…

FX110网:如何判断行情是真突破还是假突破?

众所周知&#xff0c;在交易过程中&#xff0c;趋向线的突破对买入、卖出时机等选择具有重要的分析意义。因此&#xff0c;搞清趋势线何时突破&#xff0c;是有效的突破还是非有效的突破&#xff0c;于投资者而言是至关重要的。 本文将提供一些对于趋向线突破的判断方法和市场原…

软考 系统分析师系列知识点之信息系统战略规划方法(4)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之信息系统战略规划方法&#xff08;3&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.2 关键成功因素法 关键成功因素&#xff08;Critical Success Factors&#xff0c…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 Spark新特性 自适应查询(SparkSQL) 动态合并 动态调整Join策略 …

Redis篇之持久化

一、为什么要进行持久化 Redis是一个基于内存的键值存储系统&#xff0c;但为了保证数据在服务器重启、故障等情况下不丢失。 二、应该怎么持久化 1.RDB持久化 &#xff08;1&#xff09;RDB是什么 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff…

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露&#xff1a; 像比如ContentProvider,BroadcastReceiver&#xff0c;Activity等组件有android:exported属性&#xff1b; 如果是私有组件 android:exported “false”&#xff1b; 如果是公有组件 android:exported “true” 且进行权限控制&…

[BeginCTF]真龙之力

安装程序 双击安装 出现了安装失败的标签&#xff0c;开发者不允许测试。 查看Mainfest入口文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" android:versionCo…

【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

Electron基本介绍

Electron基本介绍 Electron 官方网站&#xff1a;https://www.electronjs.org/zh/ Electron安装方法&#xff1a;npm install electron -g 全局安装 Electron简介&#xff1a;Electron提供了丰富的本地&#xff08;操作系统&#xff09;API&#xff0c;使你能够使用纯JavaScr…

springboot项目热部署实现(Spring Boot DevTools方式)

文章目录 Spring Boot DevTools简介Spring Boot DevTools原理spring Boot Devtools优缺点Spring Boot DevTools集成步骤第一步&#xff1a;添加maven依赖第二步&#xff1a;IDEA热部署配置 Spring Boot DevTools简介 Spring Boot DevTools是Spring Boot提供的一个开发工具&…

UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结

UE4运用C和框架开发坦克大战教程笔记&#xff08;十九&#xff09;&#xff08;第58~60集&#xff09;完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑&#xff…

K8S之运用亲和性设置Pod的调度约束

亲和性 Node节点亲和性硬亲和实践软亲和性实践 Pod节点亲和性和反亲和性pod亲和性硬亲和实践 pod反亲和性 Pod 的yaml文件里 spec 字段中包含一个 affinity 字段&#xff0c;使用一组亲和性调度规则&#xff0c;指定pod的调度约束。 kubectl explain pods.spec.affinity 配置…

MySQL优化器

优化器 MySQL存储引擎中存在了一个可插拔的优化器OPTIMIZER_TRACE&#xff0c;可以看到内部查询计划的TRACE信息&#xff0c;从而可以知道MySQL内部执行过程 查询优化器状态 show variables like optimizer_trace;Variable_name Valueoptimizer_trace enabledoff,one_lineoff…

[C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow

在OpenCV中&#xff0c;imshow函数默认情况下是不支持滚动条的。如果想要显示滚动条&#xff0c;可以考虑使用其他库或方法来进行实现。 一种方法是使用Qt库&#xff0c;使用该库可以创建一个带有滚动条的窗口&#xff0c;并在其中显示图像。具体步骤如下&#xff1a; 1&…

【翻译】Processing安卓模式的安装使用及打包发布(内含中文版截图)

原文链接在下面的每一章的最前面。 原文有三篇&#xff0c;译者不知道贴哪篇了&#xff0c;这篇干脆标了原创。。 译者声明&#xff1a;本文原文来自于GNU协议支持下的项目&#xff0c;具备开源二改授权&#xff0c;可翻译后公开。 文章目录 Install&#xff08;安装&#xff0…

路由引入路由过滤排错

目录 排错网络拓扑图 排错需求 故障排错 故障一 故障二 故障三 排错网络拓扑图 排错需求 按照图示配置 IP 地址&#xff0c;总部和分支 A、分支 B 各自使用 loopback 口模拟业务网段公司业务流分为 A 流和 B 流&#xff0c;网段如图所示总部内部配置 OSPF 互通&#xff0…

Frostmourne (霜之哀伤)日志告警系统部署安装

简介 Frostmourne(霜之哀伤)是汽车之家经销商技术部监控系统的开源版本&#xff0c;用于帮助监控几乎所有数据库数据(包括Elasticsearch, Prometheus, SkyWalking, MySql 等等)。如果你已经建立起了日志系统&#xff0c; 指标体系&#xff0c;却苦恼于没有一个配套监控系统&am…

【芯片设计- RTL 数字逻辑设计入门 15 -- 函数实现数据大小端转换】

文章目录 函数实现数据大小端转换函数语法函数使用的规则Verilog and Testbench综合图VCS 仿真波形 函数实现数据大小端转换 在数字芯片设计中&#xff0c;经常把实现特定功能的模块编写成函数&#xff0c;在需要的时候再在主模块中调用&#xff0c;以提高代码的复用性和提高设…

「递归算法」:二叉树剪枝

一、题目 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1&#xff1a; 输入&#xff1a;root [1,null,0,0,1] 输出&…

编曲学习:旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧

旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65be1ba7e4b064a83b92a3d7?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv文档https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_pro/cour…