CSAPP - Data Lab 详解
Data Lab [Updated 12/16/19] (README, Writeup, Release Notes, Self-Study Handout)
Students implement simple logical, two’s complement, and floating point functions, but using a highly restricted subset of C. For example, they might be asked to compute the absolute value of a number using only bit-level operations and straightline code. This lab helps students understand the bit-level representations of C data types and the bit-level behavior of the operations on data.
实验作业网址:http://csapp.cs.cmu ...
第4章 表达式
表达式基础
运算对象转换:小整数类型会被提升为较大的整数类型
重载运算符:当运算符作用在类类型的运算对象时,用户可以自行定义其含义。
左值和右值:
C中原意:左值可以在表达式左边,右值不能。
C++:当一个对象被用作右值的时候,用的是对象的值(内容);
被用做左值时,用的是对象的身份(在内存中的位置)。
求值顺序:int i = f1() + f2()
先计算f1() + f2(),再计算int i = f1() + f2()。但是f1和f2的计算先后不确定
但是,如果f1、f2都对同一对象进行了修改,因为顺序不确定,所以会编译出错,显示未定义
算术运算符
溢出:当计算的结果超出该类型所能表示的范围时就会产生溢出。
bool类型不应该参与计算1234bool b=true;bool b2=-b; //仍然为true//b为true,提升为对应int=1,-b=-1//b2=-1≠0,所以b2仍未true
取余运算m%n,结果符号与m相同
逻辑运算符
短路求值:逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定 ...
第3章 字符串、向量和数组
using声明
使用某个命名空间:例如 using std::cin表示使用命名空间std中的名字cin。
头文件中不应该包含using声明。这样使用了该头文件的源码也会使用这个声明,会带来风险。
string
标准库类型string表示可变长的字符序列。
#include <string>,然后 using std::string;
string对象:注意,不同于字符串字面值。
定义和初始化string对象
初始化string对象的方式:
方式
解释
string s1
默认初始化,s1是个空字符串
string s2(s1)
s2是s1的副本
string s2 = s1
等价于s2(s1),s2是s1的副本
string s3("value")
s3是字面值“value”的副本,除了字面值最后的那个空字符外
string s3 = "value"
等价于s3("value"),s3是字面值"value"的副本
string s4(n, 'c')
把 ...
第2章 变量和基本类型
任何常用的编程语言都具备一组公共的语法特征,最基本的特征包括:
整型、字符型等内置类型
变量,用来为对象命名
表达式和语句,用于操作上述数据类型的具体值
if 或 while 等控制结构,有选择地执行一些语句或重复地执行一些语句
函数,用于定义可供随时调用的计算单元
大多数编程语言通过两种方式来进一步补充其基本特征:
自定义数据类型,实现对语言的扩展
将一些有用的功能封装成库函数
基本内置类型
基本算数类型:
类型
含义
最小尺寸
bool
布尔类型
8bits
char
字符
8bits
wchar_t
宽字符
16bits
char16_t
Unicode字符
16bits
char32_t
Unicode字符
32bits
short
短整型
16bits
int
整型
16bits (在32位机器中是32bits)
long
长整型
32bits
long long
长整型
64bits (是在C++11中新定义的)
float
单精度浮点数
6位有效数字
double
双精度浮点数
10位有效数字
long d ...
介绍
介绍
什么是设计模式
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 ——Christopher Alexander
软件设计复杂的根本原因
变化:客户需求的变化、技术平台的变化、开发团队的变化、市场环境的变化……
如何解决复杂性?
分解
人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题
抽象
更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。
软件设计的目标
软件设计的金科玉律:复用!
面向对象设计原则
为什么要面向对象设计?
变化是复用的天敌!
面向对象设计的最大优势在于:抵御变化!
重新认识面向对象
理解隔离变化
从宏观层面来看,面向对象的构建方法更能适应软件的变化,能将变化所带来的影响降到最低。
各司其职
从围观层面来看,面向对象的方式更强调各个类的“责任”
由于需求变化导致的新增类型不应该影响原来类型的实现——是 ...
第1章 开始
熟悉编译器
g++:
编译:g++ --std=c++11 ch01.cpp -o main
运行:./prog1
查看运行状态:echo $?
编译多个文件:g++ ch2.cpp Sales_item.cc -o main
输入 g++ --help,查看编译器选项,部分常见选项如下:
123456-E Preprocess only; do not compile, assemble or link-S Compile only; do not assemble or link-c Compile and assemble, but do not link-o <file> Place the output into <file>-pie Create a position independent executable-shared ...
Cherno笔记 51-70
Cherno笔记(下)
71 Safety in modern C++ and how to teach it
安全编程:希望降低崩溃、内存泄漏、非法访问等问题。
当我们开始倾向于智能指针之类的东西时,这一切可以归纳为想分配堆内存。
智能指针和自动内存管理系统的存在使得程序员的生活更容易,更有力(当忘记处理某些事情时,它会自动处理)。
省流助手:生产环境使用智能指针,学习使用原始指针,当然,如果你需要定制的话,也可以使用自己写的智能指针(特定平台需要,或者根据平台特点压榨特定平台性能)。
72 Precompiled Headers in C++
预编译的头文件实际上时让你抓取一堆头文件,并将它们转化成编译器可以使用的格式,而不必一遍遍地读取这些头文件。
问题:每次在C++文件中#include<vector>时,需要读取整个vector头文件并编译, 不仅如此,vector还包含一堆其他的包含文件,这些文件一样需要读取。
每次对C++文件进行修改,整个文件需要重新编译,那么vector头文件又需要复制粘贴、解析、编译(不断解析编译同样的代码)。
预编译头文件的作用:接收一 ...
Cherno笔记 51-70
课程地址:Youtube上TheCherno上传的视频
翻译:神经元猫的高质量翻译
51 Making and Working with Libraries in C++ (Multiple Projects in Visual Studio)
讲如何在vs中建立多个项目,以及如何创建一个库让所有项目都能用。
确保目标project的配置类型为静态类(.lib)。
设置“附件包含目录”以便能在include时能正确寻找到目标文件。
添加引用,这会帮我们自动设置连接器输入,并且改名时不受影响,还会自动创建完整的依赖关系图,先编译依赖后编译此文件。
由于是静态链接,移动后仍然可用,若为动态链接则必须和dll文件在同一目录下。
52 How to Deal with Multiple Return Values in C++
法1 返回struct
法2 传入存结果的指针,没有动态分配
从技术上来说可能是最理想的方法,因为没有复制。
法3 返回数组——只有类型相同时才适用
声明:static std::string* ParseShader(const std::string& ...
Cherno笔记 31-50
课程地址:Youtube上TheCherno上传的视频
翻译:神经元猫的高质量翻译
31 How Strings Work in C++ (and how to use them)
新的C++标准舍弃了C风格的字符串:const char* name = “JKA” (不知道,反正VS2022还能用)。
1234567891011121314151617#include <iostream>int main() { const char* name = "JKA"; // vs2017后"const char*"类型值不能用于初始化化"char*" std::cout << name << std::endl; int big = 9; // 栈内存守卫,后面也会加上cc字节 char name2[3] = { 'J', 'K', 'A' }; //char name2[4] = ...
Cherno笔记 1-30
💡 “Best C++ course for game development。”
同样适合作为C++初学者的入门课,讲到都是C++在工作中最重要的内容。
课程地址:Youtube上TheCherno上传的视频
翻译:神经元猫的高质量翻译
1 Welcome to C++
如果用C++写垃圾代码,甚至有可能比虚拟机语言(C#, Java)更慢,因为后者会再运行时优化很多东西而C++不会。
2 How to Setup C++ on Windows
不要使用VS默认位置:地址长且包含一个空格,英伟达的某些VS安卓插件的某些部分无法正常工作。
solution基本就是一个工作台,是一个包含多个相关project的集合,这些project可以是不同类型的,比如dll、exe、lib等,而每个project是文件的集合,然后被编译成某种目标二进制文件(比如library或executable)。
3 How to Setup C++ on Mac
后面的教程都是基于Visual Studio的,由于没钱买Mac,这里就跳过了。
4 How to Setup C++ on Linux
这节 ...