这里是Cpp学习笔记正文。编译等相关内容请看《浅谈编译》

1

进制 单位(弱智篇)

bit——b——位,比特
Byte——B——字节
1 bit = 8 byte 一个1或者0占一个字节。

存储

这里涉及到计科汇编,机器码,寄存器,运算单元,总线什么的。到时候再说。
机器数:

  • 原码

  • 反码

  • 补码
    原码:八位寄存器,最高位符号,后面7个位置放二进制;
    反码:对于负值,符号位不变,后7个位置10互换;
    补码:在反码基础上+1。

变量(弱智篇)

常见变量
  • char 1 byte = 8 bit 2^7=可以表示128个字符

char类型通常只有8位,能表示的数值范围是-128到-1,0到127(如果是有符号的)或者0到255(256个数字!无符号的)。

  • short 2 byte = 16 bit 2^15=3w2

  • int 4 byte = 32 bit 2^31=21b

  • long 4B (取决于编译器)

  • long long 8B

  • float 4B

  • double 8B

  • bool 1/0 1B但是只需1b,可以将8个bool放一个B里。
    为什么会少一位呢。因为有一位符号占位。太好拉!哭。如何占满0和1?只需要在变量前面加上unsigned即可。

sizeof

如何看大小?用到sizeof拉!注意他是个运算符不是个函数。用法:
std::cout<<sizeof 变量如'bool'<< endl;

关于小数
int main()
{
  float a = 5.5f ;//这里如果不加f还是double
  double var =5.2;
  xxxxxxxx(打印)
}
char
#include <iostream>
int main()
{
    char a=65;
    std::cout << a << std::endl;
    std::cin.get();
}

char 数据类型将单个字符存储为 ASCII 编码形式。通常是指计算机中使用的字母、数字和符号,包括:1、2、3、A、B、C、常见符号等。每个字符占用空间为1字节。
简单来说。char输出的是字符。你输入'A',那么就输出A这个字符。如果你输入65(无单引号),那么还是输出字符。输出的是ASCII表中65对应的A。如果输入65。
ASCII表的65是A,因此输出的是A。

但是!如果是这样的话:

#include <iostream>
int main()
{
    char a='65';
    std::cout << a << std::endl;
    std::cin.get();
}

输出的结果是5。并且会出现以下报错:warning: overflow in conversion from 'int' to 'char' changes value from '13877' to ''5''。这里的意思是数字13877溢出了,输出的5。为什么报错是13877 我也不清楚。谁能告诉我小恐龙太好拉?!但是实践下来每次都是保留最后一位。不知道为啥。反正报错是因为溢出了。 char只能有一个字节。因为这里的的'65'是当成字符处理。在ASCII表中65对应的是3635H。16进制转换为13877(我们C语言老师还是有点实力的。这里谢谢她。)因为溢出。

函数

函数可以没有参数也可以没有返回数据。但是如果有了返回类型那必须要有返回值,除了main函数!
用法1:

#include <iostream> 
int Multiply (int a,int b)
{
  return a * b;
}

void MultiplyAndlog(int a, int b)//这里void就是不期望返回任何值
{
  int result = Multiply(a,b);
  std::cout<<result<<std::endl;
}

int main ()
{
  /*
  int result =Multiply(3,2)
  std::cout << result << std::endl;
  int result =Multiply(7,6)
  std::cout << result << std::endl;
  int result =Multiply(2,7)
  std::cout << result << std::endl;
  等同于
  */
  MultiplyAndlog(3, 2);
  MultiplyAndlog(7, 6);
  MultiplyAndlog(2, 7);
  std::cin.get
}

注意不要把每个步骤都拆分为不同的函数。不然难维护,效率也会低*每次调用函数时编译器生成一个call函数,意味着在运行一个程序时为了调用一个函数我们需要创建一个堆栈(stack)结构,必须把参数这些堆进堆栈,还要将返回地址压入堆栈,然后要跳到二进制执行文件的不同部分以便开始执行函数。为了将push进去的结果返回,还得回到最初调用函数之前。就这样在内存里来回横跳。
*:这都是编译器假设的,决定保持我们的函数作为一个实际的函数,不做内联inline工作。

头文件

crow,一个轻形后端cpp服务器,整个代码体系里基本都是头文件。头文件是一个专门存放声明的地方。
创建一个.h文件会自动生成pragma once所有#开头的代码都是预处理器命令。pragma让只包含这个文件一次。防止单个头文件被包含多次。并且被转换成单个翻译单元。否则我们会得到duplicate复制错误。

pragma once

eg: 这里创建一个结构体做演示

结构体(struct):是在C语言编程中,一种用户自定义可使用的数据类型,且是由多个相同或不同数据类型的数据项构成的一个集合。所有的数据项组合起来表示一条记录。(如:学生的结构体,数据项有学号、姓名、班级等等)
常用于定义的数据项类型:char、int、short、long、float、double、数组、指针、结构体等等。(结构体的成员变量数据类型)

//这里是头文件1.h
struct Player {};
//这里是index.cpp
#include "1.h"
#include "1.h"

就会报错erro C2011:'player': 'struct' type redefinition因为我们重定义了player结构体。我们只能定义一个叫player的结构体。
常见的错误:2.h里面include了1.h。然后index.cpp又同时include了1.h和2.h。因为include是复制。所以如果没有pragma once。就会出现两次1.h。

ifndef

还有种方法就是ifndef