当前位置: 首页 > news >正文

复习一下Cpp(1)

文章目录

  • 1. Cpp可执行文件的生成过程(003)
    • 1.1. 可执行程序的生成过程
      • 1.1.1 预处理
      • 1.1.2 编译
      • 1.1.3 汇编
      • 1.1.4 链接
    • 1.2. 细节补充
  • 2. 查看变量地址以及变量大小(090)
  • 3. 变量声明 and 字面量数据类型 and 运算符(010)
  • 4. 除法运算,如何保留浮点结果(011)
  • 5. 常量(013)
  • 6. auto类型(014)
  • 7. bool类型(017)
  • 8. 逻辑运算短路特性
  • 9. string的基本用法(025)

1. Cpp可执行文件的生成过程(003)

1.1. 可执行程序的生成过程

1.1.1 预处理

  1. 输入: .cpp 源文件、.h 头文件
  2. 输出: 经过预处理的 .cpp 文件
  3. GCC/Clang: g++ -E main.cpp -o main.i
  4. 常见报错No such file or directory

1.1.2 编译

  1. 输入: 经过预处理的 .cpp 文件 (或 .i 文件)
  2. 输出: 汇编代码文件 (.s.asm)
  3. GCC/Clang: g++ -S main.i -o main.s (如果直接从 .cpp 文件开始,通常是 g++ -S main.cpp -o main.s)
  4. 常见报错: Syntax error (语法错误)、Type mismatch (类型不匹配)、Undeclared identifier (未声明的标识符)等
  5. Undeclared identifier的补充: 使用了一个变量、函数或类名,但在当前编译单元(.cpp 文件及其包含的头文件)中没有找到它的声明

1.1.3 汇编

  1. 输入: 汇编代码文件 (.s.asm)
  2. 输出: 机器码文件(目标文件,.o.obj (Windows))
  3. GCC/Clang: g++ -c main.s -o main.o (通常直接从 .cpp 到 .o:g++ -c main.cpp -o main.o)

1.1.4 链接

  1. 输入: 一个或多个目标文件 (.o.obj)、静态库 (.a.lib)、动态库 (.so.dll)
  2. 输出: 可执行文件(Linux下无后缀,Windows 下.exe
  3. GCC/Clang: g++ main.o func.o -o my_program (或 g++ main.cpp func.cpp -o my_program 直接从源文件链接)
  4. 常见报错: Undefined reference to 'function_name' (未定义的引用)、Multiple definition of 'symbol_name' (符号重复定义)、Name Mangling (符号名不匹配)
  5. Name Mangling的补充:当 G++ 遇到 C++ 名称修饰不匹配(C++ 代码尝试链接一个没有 extern "C" 声明的 C 函数)时,它通常会报错为 undefined reference,但错误信息中的函数名会显示为经过 C++ 名称修饰后的形式。例如undefined reference to _Z12c_functionv

1.2. 细节补充

  1. 每个 .cpp 文件是单独编译的:
    • 这意味着编译器在处理一个 .cpp 文件时,只知道该文件内部以及通过 #include 引入的头文件中声明的内容。它并不知道其他 .cpp 文件中定义了什么,除非这些定义通过头文件暴露出来。
    • 这种独立编译的机制使得大型项目可以并行编译,提高效率。

2. 查看变量地址以及变量大小(090)

#include <iostream>int main()
{int a = 0;std::cout << "a的16进制地址" << &a << std::endl;std::cout << "a的10进制地址" << (long long) & a << std::endl;std::cout << "a占有的字节数" << sizeof(a) << std::endl;return 0;
}
# result
a的16进制地址000000D60C2FF6C4
a的10进制地址919327471300
a占有的字节数4

3. 变量声明 and 字面量数据类型 and 运算符(010)

#include <iostream>int main()
{// 1.变量声明:类型 变量{初值}。会检查数据格式,不允许隐式类型转换。int x1{1};int x2{1.6} //报错,而不是截断成1// 2.指定字面量数据类型:LL即long long的缩写std::cout << "long long占有的字节数" << sizeof(123LL) << std::endl;// 3.运算符:自增或自减统一下面的方式,可以节省一个中间变量++x1;--x1;return 0;
}
# result
long long占有的字节数8

4. 除法运算,如何保留浮点结果(011)

#include <iostream>int main()
{// 1.不会进行四舍五入,而是直接截断小数部分int x1{ 5 };int x2{ 2 };float y1{ 0 };std::cout << "x1 / x2 = " << x1 / x2 << std::endl;y1 = x1 / x2;std::cout << "x1 / x2 = " << y1 << std::endl;std::cout << "x1 / x2 = " << float(x1 / x2) << std::endl;// 2.如果想保留浮点结果,可以将其中一个操作数转换为浮点数, 或者运算后用做强制类型转换std::cout << "x1 / x2 = " << float(x1) / x2 << std::endl;std::cout << "x1 / x2 = " << 5. / 2 << std::endl;return 0;
}
# result
x1 / x2 = 2
x1 / x2 = 2
x1 / x2 = 2
x1 / x2 = 2.5
x1 / x2 = 2.5

5. 常量(013)

#include <iostream>int main()
{int x1{ 1 };int x2{ 2 };// 1.编译时常量:编译时确定常量值constexpr int cx1{ 1 };// 2.运行时常量:运行时确定常量值const int cx2{ x1 + x2 };return 0;
}

6. auto类型(014)

#include <iostream>int main()
{constexpr int cx1{ 1 };const int cx2{ 2 };// x1 和 x2 不会保留 constexpr 和 const 属性auto x1 = cx1;auto x2 = cx2;// x1 和 x2 保留 constexpr 和 const 属性constexpr auto x1 = cx1;const auto x2 = cx2;return 0;
}

7. bool类型(017)

  1. bool占的字节数有可能不一定=1,即
#include <iostream>int main()
{bool x1{ 0 };std::cout << sizeof(x1) << std::endl; // 一般sizeof(x1)=1,但是有可能sizeof(x1)不=1return 0;
}

8. 逻辑运算短路特性

#include <iostream>int main()
{int x1{ 0 };// 1. 逻辑运算短路特性,or运算符左侧为真,右侧不再计算if ((++x1) or ((++x1))){std::cout << "x1=" << x1 << std::endl;}// 2. 如果是算术运算,则会执行右侧表达式int x2{ 0 };if ((++x2) | ((++x2))){std::cout << "x2=" << x2 << std::endl;}return 0;
}
# result
x1=1
x2=2

9. string的基本用法(025)

#include <iostream>
#include <string>using namespace std;int main()
{// 1.定义string x1{"test"};// 2.拼接cout << "拼接\t" << x1 + "ing" << endl;// 3.查找string key = "es";auto pos = x1.find(key);if (pos != string::npos){cout << "查找\t" << pos << endl;}// 4.替换 or 删除x1.replace(pos, key.size(), "");cout << "替换或删除\t" << x1 << endl;// 5.插入x1.insert(pos, key);cout << "插入\t" << x1 << endl;// 6.子串cout << "子串\t" << x1.substr(pos, key.size()) << endl;return 0;
}
# result
拼接    testing
查找    1
替换或删除      tt
插入    test
子串    es
http://www.dtcms.com/a/431324.html

相关文章:

  • 什么网站访问量公司变更地址需要多少钱
  • final字段单元测试
  • 车载Class D功放电源脚烧蚀可能原因
  • 34线城市做网站推广最新新闻事件摘抄
  • 嵌入式ARM程序高级调试技能:26. ARM Linux CPU高负载分析:系统调用过多导致的线程高负载案例
  • 无锡企业自助建站系统网站开发和游戏开发的区别
  • 外贸网站平台都有哪些平台毕业设计做网站简单吗
  • dotnet-sdk-5.0.408-win-x64安装教程(附详细步骤和附安装包)
  • 数据要素X_解读 第三批“数据要素×”典型案例——金融服务领域【附全文阅读】
  • 一篇文章讲清Prompt、Agent、MCP、Function Calling
  • 网站栏目设计方案物流网络货运平台
  • 异步静态Sdram操作
  • 淘宝客的网站是怎么做的运城学院教务网络管理系统
  • 天津哪里做网站东莞网站建设服务有什么用
  • 网站原型设计和版式设计网站设计哪家公司好
  • 详解doris基础
  • 利用表单大师做网站济南建网站app
  • 网站需求分析文档懒人办公ppt模板免费
  • Java 集合框架之 List 全面解析(从概念到实践)
  • Linux-03_02(Linux实用操作)
  • 毕业设计 网站开发如何用dw做网站框架
  • Matlab通过GUI实现点云的最小二乘法(Kabsch)配准
  • 南浔建设局网站怎样进行seo
  • 全flash 电子商务网站如何推广医疗企业网站模板免费下载
  • 宁波市城市建设档案馆网站鹿泉区建设局网站
  • 密集人群中的行人检测YOLO数据集
  • 智能网站建设平台中国新闻社领导名单
  • 【杂谈】-AGI 辩论:炒作、怀疑与现实期望之间
  • 【LaTeX】 4 LaTeX 逻辑结构
  • 做淘宝还是做网站容易查看网站外链