【笔记】C++系列01:从hello开始说变量、数据类型、常量与运算法

发布时间 2023-11-15 14:39:06作者: 哆啦梦乐园

1.1 程序

/*
程序范例:第一个c++程序
版权拥有人:
*/

#include <iostream>    // 载入外部文件,这里写法和早起C++不同,不用跟.h

class Printer          //定义类
{
private:
    int Serial_Number; //定义类的属性,这里默认被赋值为0;每行代码后加分号,这个和python不同

public:
    void Hello()  //定义类的方法
    {
        std::cout << "Hello C++\n";             // 打印内容并换行,读作C-out,和python的print()以及java的System.out.println()类似
        std::fflush(stdout);                    // using namespace std时,可以直接用cout和fflush,但这样等于引入整个命名空间,导致空间污染和很不多必要问题
        std::cout << "Hello C++"<< std::endl;   // std::endl等于换行+刷新缓存
    }
};   //完成类的定义,需要分号

int main()     // 程序进入点,早期c++是不用返回值用void的,现在都要求返回整型
{
    Printer printer;   // 申明对象,不用像java一样new
    printer.Hello();   // 调用方法
    return 0;
}  // 完成方法的定义,无须分号

1.2 数据类型

#include <iostream>
#include <limits>
#include <string>

int main() {
    // 基本数据类占用存储空间的大小
    std::cout << "Size of char:        " << sizeof(char) << " byte(s)" << std::endl;
    std::cout << "Size of short:       " << sizeof(short) << " byte(s)" << std::endl;
    std::cout << "Size of int:         " << sizeof(int) << " byte(s)" << std::endl;
    std::cout << "Size of long:        " << sizeof(long) << " byte(s)" << std::endl;
    std::cout << "Size of long long:   " << sizeof(long long) << " byte(s)" << std::endl;
    std::cout << "Size of float:       " << sizeof(float) << " byte(s)" << std::endl;
    std::cout << "Size of double:      " << sizeof(double) << " byte(s)" << std::endl;
    std::cout << "Size of long double: " << sizeof(long double) << " byte(s)" << std::endl;
    std::cout << "Size of bool:        " << sizeof(bool) << " byte(s)" << std::endl;

    // 查看数据类型的最大值和最小值-部分类型
    std::cout << "Minimum value of char:           " << std::numeric_limits<char>::min() << std::endl;
    std::cout << "Maximum value of char:           " << std::numeric_limits<char>::max() << std::endl;
    std::cout << "Minimum value of short:          " << std::numeric_limits<short>::min() << std::endl;
    std::cout << "Maximum value of short:          " << std::numeric_limits<short>::max() << std::endl;
    std::cout << "Minimum value of unsigned short: " << std::numeric_limits<unsigned short>::min() << std::endl;
    std::cout << "Maximum value of unsigned short: " << std::numeric_limits<unsigned short>::max() << std::endl;
    std::cout << "Minimum value of bool:           " << std::numeric_limits<bool>::min() << std::endl;
    std::cout << "Maximum value of bool:           " << std::numeric_limits<bool>::max() << std::endl;

    // c++使用string类型,要引入#include <string>,并使用std::string方式
    std::cout << "Minimum value of string:           " << std::numeric_limits<std::string>::min() << std::endl;
    std::cout << "Maximum value of string:           " << std::numeric_limits<std::string>::max() << std::endl;
    
    return 0;
}

1.3 变量

命名字首建议
short --> sh
int --> i
long --> l
float --> f
double --> d
long double --> ld
char --> c
string --> s
bool --> b
unsigned int --> ui

1.4 常量

在C++中,使用#define定义常量和const定义常量的区别主要在于它们的类型检查和作用域。

  • 类型检查:
    #define定义的常量没有类型,编译器不会对常量进行类型检查。而const定义的常量有类型,编译器会对常量进行类型检查。
  • 作用域:
    #define定义的常量在整个程序中都有效,而const定义的常量只在声明它的文件中有效。如果需要在多个文件中共享常量,建议使用const定义。

下面用代码演示这两种定义常量的方式:

#include <iostream>

// 使用#define定义常量
#define PI 3.14159

// 使用const定义常量
const int MAX_VALUE = 100;

int main() {
    std::cout << "PI: " << PI << std::endl;
    std::cout << "MAX_VALUE: " << MAX_VALUE << std::endl;

    return 0;
}

1.5 运算符

#include <iostream>

std::string printBinary(int num)
{
    std::string binary = "";
    if (num == 0)
    {
        return "0";
    }
    else if (num > 0)
    {
        while (num > 0)
        {
            int remainder = num % 2;
            binary = std::to_string(remainder) + binary;
            num /= 2;
        }
    }
    else
    {
        num = -num; // 将负数转换为正数
        while (num > 0)
        {
            int remainder = num % 2;
            binary = std::to_string(remainder) + binary;
            num /= 2;
        }
        binary = "-" + binary; // 在二进制串前加上负号
    }
    return binary;
}

int main()
{
    std::cout << "算术运算符示例" << std::endl;
    std::cout << "7+2=" << 7 + 2 << std::endl;
    std::cout << "7-2=" << 7 - 2 << std::endl;
    std::cout << "7*2=" << 7 * 2 << std::endl;
    std::cout << "7/2=" << 7 / 2 << std::endl;
    std::cout << "7.0/2=" << 7.0 / 2 << std::endl;
    std::cout << "7%2=" << 7 % 2 << std::endl;

    std::cout << "\n算术指定运算符示例" << std::endl;
    int A = 7;
    A += 2;
    std::cout << "A+=2 --> A=" << A << std::endl;
    A -= 2;
    std::cout << "A-=2 --> A=" << A << std::endl;
    A *= 2;
    std::cout << "A*=2 --> A=" << A << std::endl;
    A /= 2;
    std::cout << "A/=2 --> A=" << A << std::endl;
    A %= 2;
    std::cout << "A%=2 --> A=" << A << std::endl;

    std::cout << "\n比较运算符示例" << std::endl;
    std::cout << "7==2 result:" << (7 == 2) << std::endl;
    std::cout << "7>2  result:" << (7 > 2) << std::endl;
    std::cout << "7<2  result:" << (7 < 2) << std::endl;
    std::cout << "7>=2 result:" << (7 >= 2) << std::endl;
    std::cout << "7<=2 result:" << (7 <= 2) << std::endl;
    std::cout << "7!=2 result:" << (7 != 2) << std::endl;

    std::cout << "\n逻辑运算符示例" << std::endl;
    bool m = true;
    bool n = false;
    std::cout << "m&&n result:" << (m && n) << std::endl;
    std::cout << "m||n result:" << (m || n) << std::endl;
    std::cout << "!m result:  " << (!m) << std::endl;

    std::cout << "\n其它运算符示例" << std::endl;
    int x = 1;
    std::cout << "x++:" << x++ << std::endl; // 先传出值,再加1
    std::cout << "  x:" << x << std::endl;
    x = 1;
    std::cout << "++x:" << ++x << std::endl; // 先加1,再传出值
    std::cout << "  x:" << x << std::endl;
    int y = 3;
    std::cout << "y--:" << y-- << std::endl;
    std::cout << "  y:" << y << std::endl;
    y = 3;
    std::cout << "--y:" << --y << std::endl;
    std::cout << "  y:" << y << std::endl;

    std::cout << "\n位运算示例" << std::endl; //指对二进制数进行操作的运算,包括与、或、异或、取反、左移和右移等操作
    int a = 5;                                // 二进制表示为 0101
    int b = 3;                                // 二进制表示为 0011

    std::cout << "a & b:" << (a & b) << "  Binary:" << printBinary((a & b)) << std::endl; // 结果为 0001,即十进制的 1
    std::cout << "a | b:" << (a | b) << "  Binary:" << printBinary((a | b)) << std::endl; // 结果为 0111,即十进制的 7
    //按位异或(^):结果为1的位表示两个操作数对应位一个为0一个为1。
    std::cout << "a ^ b:" << (a ^ b) << "  Binary:" << printBinary((a ^ b)) << std::endl; // 结果为 0110,即十进制的 6
    //取反(~):对一个数的所有位取反,即将0变为1,将1变为0。注意,取反的结果是一个负数。
    std::cout << "~a:   " << (~a) << "  Binary:" << printBinary((~a)) << std::endl; // 结果为 -6,即二进制的补码表示为 -0101
    //左移(<<):将一个数的所有位向左移动指定的位数,右边用0填充。例如,将a向左移动2位,相当于将a乘以2的2次方。
    std::cout << "a<<2: " << (a << 2) << "  Binary:" << printBinary((a << 2)) << std::endl; // 结果为 20,即二进制的 010100
    //右移(>>):将一个数的所有位向右移动指定的位数,左边用符号位填充。例如,将a向右移动2位,相当于将a除以2的2次方。如果a是负数,那么左边用1填充;如果a是正数,那么左边用0填充。
    std::cout << "a>>2: " << (a >> 2) << "  Binary:" << printBinary((a >> 2)) << std::endl;  // 结果为 1,即二进制的补码表示为 001
    std::cout << "-5>>2:" << (-5 >> 2) << " Binary:" << printBinary((-5 >> 2)) << std::endl; // 结果为 -2,即二进制的补码表示为 -101

    return 1;
}

输出结果

算术运算符示例
7+2=9
7-2=5
7*2=14
7/2=3
7.0/2=3.5
7%2=1

算术指定运算符示例
A+=2 --> A=9
A-=2 --> A=7
A*=2 --> A=14
A/=2 --> A=7
A%=2 --> A=1

比较运算符示例
7==2 result:0
7>2  result:1
7<2  result:0
7>=2 result:1
7<=2 result:0
7!=2 result:1

逻辑运算符示例
m&&n result:0
m||n result:1
!m result:  0

其它运算符示例
x++:1
  x:2
++x:2
  x:2
y--:3
  y:2
--y:2
  y:2

位运算示例
a & b:1  Binary:1
a | b:7  Binary:111
a ^ b:6  Binary:110
~a:   -6  Binary:-110
a<<2: 20  Binary:10100
a>>2: 1  Binary:1
-5>>2:-2 Binary:-10