cpp-base

1.cin&cout

  1. cin对应输入流,用于获得输入/取数据;cout对应输出流,用于输出数据

  2. cin对应于>>,要从中取,数据的流向是流->变量。对应的>>叫做输入运算符。

  3. cout对应于<<,要向其中输入,数据的流向是流<-变量。对应的<<叫做输出运算符。

    考虑是>>还是<<时,将流作为左边的,固定的,被输入/输出的对象

  4. cin,coutiostream头文件中定义的对象,该文件中还定义了cerr,clog共四个ostream对象

  5. 使用istream(cin)对象作为条件时,

2.两种注释方式

//注释方法1,‘//’。用于单行注释

/*
注释方法2, 用于多行注释
*/

特别注意,两种注释方法不可以均不可以嵌套

3.读取不定量的数据

std::cin >> val作为循环条件,可以实现不定次数的输入

#include <iostream>
int main(){
    int val = 0, sum = 0;
    while (std::cin >> val){
        sum += val;
    }
    std::cout << sum << std::endl;
    return 0;
}
  1. 当后续输入的值类型与第一次输入值的类型一致时,std::cin >> val的值为1,会继续循环。
  2. 当后续输入的值类型与第一次输入值的类型一致时,std::cin >> val的值为0,会结束循环。
for (cin >> n; n != 0; cin>>n){}

上面的for语句也可以实现不定次数的输入,当输入0时停止。

4.常量

  1. const关键字定义的常量

    格式:const valType valName value

  2. #define定义的常量

    格式:#define valType value

    这种方法的常量会通过值的类型来自动确定它的类型,属于隐式

  3. bool类型的值与符号常量

    bool类型的值,即True/False可以看作cpp预定义的两个整形常量,其值分别为1、0。

5.浮点数的等于与不等

  1. 应该避免对浮点数进行==/!=的运算,如下例。

    double x = 3.0, y = 4.0;
    bool a = (y-x*(y/x)*y == 0.0);
    cout << a << endl;
    ##一些编译器中,a的值可能为0,即false。说明浮点数相减的值不为零。
    
  2. 对于浮点数的比较,应当采用绝对值只差很小来判断两个浮点数是否相等。

    double x = 3.0, y = 4.0;
    if (abs(x-y) < 1e-7)
        cout << "x == y" << endl;
    else 
        cout << "x != y" << endl;
    

6.位运算

  1. 取反~

    指将0变为1,将1变为0

  2. &

    1&1=1,其余为0

  3. |

    0|0=0,其余为1

  4. 异或^

    相异为1,其余为0。异或的一个性质:( x ^ a ) ^ a = x

  5. 左移操作<<

    • 左移规则:将符号左边的数转为二进制后,将该数整体左移,移动的位数为符号右边的数。
    • 移动方法:将二进制数整体向左移动,高位舍弃,低位补齐0
    • 有时左移1位相当于*2
  6. 右移操作>>

    • 右移规则:将符号左边的数转为二进制后,将该数整体右移,移动的位数为符号左边的数。
    • 移动方法:将二进制数整体向右移动,舍弃低位,而对于高位:
      • 对于有符号的数:高位补齐原最高位(符号位)
      • 对于无符号的数有符号的非负数:高位补0

7.表达式

graph LR 表达式 --> 常量表达式 & 左值表达式
  1. 常量表达式:在编译时能够确定其值的表达式
  2. 左值表达式:指能出现在赋值操作符=左边的表达式。这种表达式值的结果存放在固定的、可读取的内存中,而非临时的存储空间中。如:
    • ++x是一个左值表达式,该式子的值存在了x中
    • x++不是一个左值表达式,该式子的值为x+1,遇上一个例子不一样的是这个式子的值没有被存在变量x中,而是作为一个临时常量存在了临时存储空间中
  3. 用大括号{}括起来的表达式被视作一整个表达式

8.空语句

cpp中的空语句指的是:只包含语句结束的;,而不包含任何表达式的语句。

9.switch语句

switch (exp){
    case expVal1: .......; break;
    case expVal2: .......; break;
    default: ........;
}
  • 要检测的表达式/有值的变量放在括号中
  • case后跟要检测变量的值,且将要执行的语句放在冒号后
  • case中可以放多条语句,用;隔开,一般在语句末加break

10.循环语句

while语句

while (exp0) {exp1;exp2;...}

while语句的执行顺序如下图所示:

graph LR a(循环计算表达式0的值) --> |值为1|执行大括号内语句/while后的第一条语句 a(循环计算表达式0的值) --> |值为0|结束循环/继续向下执行while后的第二条语句

do-while语句

do {exp1,exp2,.....} while (exp0);		

do-while循环的执行流程如下所示:

graph TD a(exp1,exp2,....) --> b(判断exp0的值) b --> |exp0的值为0|c(结束do-while) b --> |exp0的值为1|a

for语句

for (expA; expB; expC) {exp1,exp2,.....}

for循环的执行流程如下图所示:

graph LR A(expA) -->B(expB) B(expB) -->|expB值为1|x(exp1,exp2,....) x(exp1,exp2,....) --> C(expC) C(expC) -->B(expB) B ---->|expB值为0|z(结束for循环)
  • expA|expB|expC:三个表达式可以均为空语句,但必须含有两个;
  • expA:用作赋值表达式,for开始时会无条件执行
  • expB:用于判断,值为1时循环执行循环体-expC;值为0时结束for语句
  • expC:用于迭代,即对迭代变量进行改变,为下次的循环做准备

11.无条件转移语句

无条件转移语句包括:goto,break,continuereturn

goto

labelName: doSth.....;
......
goto labelName;

goto用于转至标签处执行,标签是指用labelName:这种格式标识的内容。

特别注意

  1. goto在跳转时,不可以越过变量定义。即是说若想跨过的语句中含有变量的定义,则不能够使用goto语句。
  2. goto在跳转时,不可以跳出/跳入函数体。
  3. goto语句常用于跳出多重循环,因为break语句只能够跳出一重循环。

break

break的作用:跳出当前break所在的循环

continue

continue只能够用在循环语句中。具体来说,只能结合while,do-while,for这三种循环语句来使用。

  • 用于while时,continue将会跳过其后的语句,转至while的条件判断处
  • 用于do-while时,continue会跳至位于末尾的条件判断处
  • 用于for时,continue会跳至expC处,即循环末段迭代处,然后再送至expB条件判断处
posted @ 2022-08-13 09:45  dysonkkk  阅读(34)  评论(0编辑  收藏  举报