Skip to content

1. 运算符和基本类型转换

C++支持的运算符总体来说分为以下几种:

1.1 常用运算符分类

运算符类型作用
算术运算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值
逗号运算符取最右边表达式结果
位运算符用于处理数据的位运算
sizeof运算符用于求字节数长度

练习:

cpp
#include<iostream>
int main()
{
    std::cout << "sizeof(char) = " << sizeof(char) << std::endl;
    std::cout << "sizeof(int) = " << sizeof(int) << std::endl;
    std::cout << "sizeof(float) = " << sizeof(float) << std::endl;
    std::cout << "sizeof(double) = " << sizeof(double) << std::endl;
    return 0;
}

1.2 算术运算符

运算符术语示例结果
+正号+33
-负号-3-3
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模(取余)10 % 31
++前自增a=2; b=++a;a=3; b=3;
++后自增a=2; b=a++;a=3; b=2;
--前自减a=2; b=--a;a=1; b=1;
--后自减a=2; b=a--;a=1; b=2;

练习:

cpp
#include<iostream>
int main()
{
    int a = 0;
    int b = 0;
    std::cout << "请输入两个值:";
    std::cin >> a >> b;
    std::cout << a << " + " << b << " = " << a + b << std::endl;
    std::cout << a << " - " << b << " = " << a - b << std::endl;
    std::cout << a << " * " << b << " = " << a * b << std::endl;  // 原文笔误:符号显示为"+"但实际是乘法
    std::cout << a << " / " << b << " = " << a / b << std::endl;
    std::cout << a << " % " << b << " = " << a % b << std::endl;
    return 0;
}

注意:除法和取余除数不能为0

cpp
#include<iostream>
int main()
{
    int a = 2;
    int b = 0;
    std::cout << a << " / " << b << " = " << a / b << std::endl;  // 导致运行时错误
    std::cout << a << " % " << b << " = " << a % b << std::endl;  // 导致运行时错误
    return 0;
}

自增/减注意点:

cpp
#include<iostream>
int main()
{
    int a = 2;
    int b = 0;
    b = ++a;
    std::cout << "a = "<< a << ", b = "<< b << std::endl; // 3 3
    
    a = 2;
    b = 0;
    b = a++;
    std::cout << "a = "<< a << ", b = "<< b << std::endl; // 3 2

    // 不推荐写法(结果依赖编译器)
    a = 2;
    b = 0;
    b = ++a + a++;  // 原文笔误:注释中写的是a++ + ++a
    std::cout << "a = "<< a << ", b = "<< b << std::endl; // 4 6
    return 0;
}

1.3 赋值运算符

运算符术语示例结果
=赋值a=2; b=3;a=2; b=3;
+=加等于a=0; a+=2;a=2;
-=减等于a=5; a-=3;a=2;
*=乘等于a=2; a*=2;a=4;
/=除等于a=4; a/=2;a=2;
%=模等于a=3; a%=2;a=1;

练习:

cpp
#include<iostream>
int main()
{
    int a = 10;
    int b = 3;
    a += b;  // a = 13
    a -= b;  // a = 10(原文注释:/= 中间不能有空格)
    a *= b;  // a = 30(原文注释:/= 中间不能有空格)
    a /= b;  // a = 10
    a %= b;  // a = 1
    return 0;
}

1.4 比较运算符

真假性规则: 非0为真,0为假。

运算符术语示例结果
==相等于4 == 30
!=不等于4 != 31
<小于4 < 30
>大于4 > 31
<=小于等于4 <= 30
>=大于等于4 >= 11

练习:

cpp
#include<iostream>
int main()
{
    int a = 4, b = 3;
    int c = (a == b);  // 0
    c = (a = b);       // 3(赋值非比较!)
    c = (a < b);       // 0
    c = (a > b);       // 0(此时a=b=3)
    c = (a <= b);      // 1
    c = (a >= b);      // 1
    return 0;
}

1.5 逻辑运算符

运算符术语示例结果规则
!!aa假则1,a真则0
&&a && ba和b均为真时结果为1,否则0
||a || ba或b至少一个为真时结果为1,两者均假则0

练习:

cpp
#include<iostream>
int main()
{
    int a = 4, b = 0;
    bool c = !a;        // 0
    c = !b;             // 1
    c = (a != 0) && (a >= b);  // 1
    c = (b != 0) && (a >= b);  // 0
    c = (a != 0) \|\| (a == b); // 1
    c = (b != 0) \|\| (a == b); // 0
    return 0;
}

1.6 逗号操作符

规则: 取最后一个表达式的值
示例:

cpp
#include <iostream>
int main()
{
    int a = 10, b = 20, c = 0;
    c = (a + 1, a + b, a - b);  // c = -10
    return 0;
}

1.7 位运算符

符号名称运算规则
&按位与同1为1
|按位或有1为1
^按位异或不同为1
~按位取反0变1,1变0
<<按位左移乘以2的n次方
>>按位右移除以2的n次方

1.7.1 按位与

cpp
9 & 8 = 8  (1001 & 1000 = 1000)
9 & 4 = 0  (1001 & 0100 = 0000)

1.7.2 按位或

cpp
9 | 5 = 13 (1001 | 0101 = 1101)

1.7.3 按位异或
规律:

  • 相同数异或为0(5^5=0)
  • 顺序无关(3^4^5 = 3^5^4 = 2)
  • a^b^b = a

交换变量值:

cpp
a = a ^ b;
b = b ^ a;  // b = a
a = a ^ b;  // a = b

1.7.4 按位取反

cpp
~9 = -10  // 二进制取反后按补码计算

1.7.5 按位左移

cpp
2 << 2 = 8  // 可能改变符号位

1.7.6 按位右移

cpp
15 >> 3 = 1     // 正数补0
-15 >> 3 = -2   // 负数补1(依赖编译器)

1.8 三目运算符

格式: 表达式1 ? 表达式2 : 表达式3
示例:

cpp
#include <iostream>
int main()
{
    int a=10, b=20;
    int max = (a > b) ? a : b;

    // 嵌套判断
    (a >= 0) ? 
        ((a == 0) ? std::cout << "0" : std::cout << "正数") : 
        std::cout << "负数";
    return 0;
}

1.9 运算符优先级

从高到低:

  1. [] () . ->
  2. -(负号) ~ ++ -- *(指针) & ! (类型) sizeof
  3. * / %
  4. + -
  5. << >>
  6. > >= < <=
  7. == !=
  8. &(位与)
  9. ^
  10. |
  11. &&
  12. ||
  13. ?:
  14. = += -= 等赋值运算符
  15. ,

1.10 类型转换

1.10.1 隐式转换

cpp
int a = 1 / 2;         // 0(整型除法)
double d1 = 1 / 2;     // 0.0(整型除法后转double)
double d2 = 1.0 / 2;   // 0.5(提升为double后计算)

1.10.2 强制转换

cpp
double b = 2.3;
int a = (int)b;  // 2(直接截断小数)

四舍五入练习:

cpp
#include <iostream>
int main()
{
    float num;
    std::cin >> num;
    std::cout << (int)(num + 0.5);  // +0.5后截断
    return 0;
}

2. 错误调试指南

2.1 代码保存

  • 文件名左上角出现*表示未保存
  • VS2022编译时自动保存

2.2 main函数拼写错误

  • 错误提示:"main函数不存在"

2.3 中英文符号错误

  • 红色下划线标识错误位置
  • 双击错误列表快速定位

2.4 标识符未定义

  • 编译报错:"未声明的标识符"

2.5 括号/花括号不匹配

  • 错误提示:"缺少}"或"缺少)"

2.6 其他异常

  • 逐步注释代码定位崩溃行

附:文档中存在的笔误说明(非原文内容,仅为说明):

  1. 算术运算符表格中乘法符号误写为+
  2. 赋值运算符表格中-=误标为<=
  3. 按位或运算符符号原文用!,实际应为|
  4. 部分代码注释与实际运算不符(如自增示例)
  5. 位取反示例中二进制表示不完整

知识如风,常伴吾身