重学C++_运算符与表达式


cout << sizeof(w) << endl;

重学C++_运算符与表达式

运算符表达式和基本语句

运算符

  • 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。

| 算术运算符 |
| :--------: |
| 关系运算符 |
| 逻辑运算符 |
| 位运算符 |
| 赋值运算符 |
| 杂项运算符 |

表达式

  • 在程序中,运算符是用来操作数据的,因此,这些数据也被称为操作数。
  • 使用运算符将操作数连接而成的式子称为:表达式。

| 表达式具有如下特点 |
| :----------------------------------------------------------: |
| 常量和变量都是表达式,例如,常量3.14、变量i |
| 运算符的类型对应表达式的类型,例如,算术运算符对应算术表达式 |
| 每一个表达式都有自己的值,即表达式都有运算结果 |

算术运算符

代码

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;

    cout << a + b << endl;// 30
    cout << a - b << endl; //-10
    cout << a * b << endl;//200
    cout<<b/a<< endl;//2
    cout << 15/a<< endl;// 1
    cout << 15.0/a<< endl; // 1.5
    cout << b%a<< endl;//0
    cout<<++a << endl;//11
    cout<<--a<< endl;// 10

}

关系运算符

代码

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;

    //关系运算符
    //0不为真,1为真
    cout << (a == b) << endl; //0
    cout << (a == b) << endl; // 0
    cout << (a != b) << endl; // 1
    cout << (a > b) << endl; // 0
    cout << (a < b) << endl; // 1
    cout << (a >= b) << endl; // 0
    cout << (a <= b) << endl; //1

}

逻辑运算符

代码

#include <iostream>
using namespace std;

int main()
{
    //0不为真,1为真
    //逻辑运算符
    int A = 1;
    int B = 0;
    cout << (A && B) << endl; //0
    cout << (A || B) << endl; //1
    cout << !(A && B) << endl; //1

}

拓展:To be or not to be, that's a question

    //To be or not to be, that's a question.
    cout << "-------------To be or not to be, that's a question.------------------- -" << endl;
    cout << (A == true || A != true) << endl; //1

拓展:德摩根律

拓展:assert断言(用于测试)

  • 程序在我的假设条件下,能够正常良好的运作,其实就相当于一个 if 语句。
if(假设成立)
{
     程序正常运行;
}
else
{
      报错&&终止程序!(避免由程序运行引起更大的错误)  
}
  • 如果assert后输出不符合预期,则报错。
  • assert(!(bA || bB) == (!bA && !bB));// 1,将其!(bA || bB)改为(bA || bB)则报错。
#include <iostream>
#include <cassert>
using namespace std;

int main()
{
    cout << "-------------assert断言.------------------- -" << endl;
    int bA = false;
    int bB = true;
    assert(!(bA || bB) == (!bA && !bB));// 1
    assert( !(bA && bB) == (!bA | !bB));// 1
    
     // 报错
    //assert((bA || bB) == (!bA && !bB));// 报错

}

赋值运算符

代码

#include <iostream>
#include <cassert>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;
    
    cout << "-------------赋值运算符------------------- -" << endl;
    int C = a + b;   
    cout << C << endl; C += a; //30
    cout << C << endl; C -= a;    //    40
    cout << C << endl; C *=a;    //        30
    cout << C << endl; C /= a;    //        300
    cout << C << endl; C %= a;    //        30
    cout << C << endl;    //        0

}

位运算符

  • 位运算符作用于位,并逐位执行操作。
  • &|^的真值表如下所示:

位逻辑运算符

移位运算符

优先级

代码

#include <iostream>
#include <cassert>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;
    
    cout << "-------------位运算符------------------- -" << endl;
    cout << (a && b) << endl;// 与   1
    cout << (a | b) << endl;//或 30
    cout << (a ^ b) << endl;//异或 30
    cout << (~a) << endl;//取反 -11
    cout << (a << 2) << endl;//左移 40
    cout << (a >> 2) << endl;//右移 2

}

杂项运算符及运算符的优先级

杂项运算符

代码_1

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;
    
    cout << "-------------杂项运算符------------------- -" << endl;
    cout << sizeof(A) << endl;//4

    int C = a > b ? 1 : 0;
    cout << C << endl; //0

    int D = a < b ? 1 : 0; 
    cout << D << endl;//1

    int E = (a,b, C); 
    cout << E << endl; //0

    float F = float(E); 
    cout << F << endl;//0
    cout << &F << endl; 
    float* P = &F; //006FF93C

    cout << P << endl; //006FF93C
    cout << *P << endl; //0

}

代码_2

#include <iostream>
using namespace std;

int main()
{
    //结构体
    struct Week
    { 
    short Sunday = 0; 
    short Monday = 1;
    short Tuesday = 2;
    short Wednesday = 3;
    short Thursday = 4;
    short Friday = 5;
    short Saturday = 6; 
    };
    Week w;
    cout << w.Friday << endl; // 5
    cout << sizeof(w) << endl;// 14

}

运算符的优先级

  • 一元运算符优先级高于对应的二元运算符。
  • 弄不清楚优先级,就加括号()

提升补充部分:补码

机器数和真值

机器数

  • 一个数在计算机中的二进制表示形式,叫做这个数的机器数
  • 机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。

真值

  • 真正的数学意义上的数值。
  • 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
  • 00000000000000000000000000000011 -> +3

无符号数的编码

有符号数的补码

另一种计算补码的方法

  • 对正数:直接按位计算权重和。
  • 对负数:保留符号位,对后面每位取反+1

补码数值范围举例

字节序(Byte Ordering)

一个字(32位机器采用32bits字长4bytes)在内存中如何以byte来存放的?

观察机器数

#include <iostream>
using namespace std;

int main()
{
    cout << "------------- 观察机器数------------------- -" << endl;

    int i1 = 0; 
    int i2 = -1;
    int i3 = -2147483648;
    int i4 = 2147483647;
    unsigned int u1 = 0;
    unsigned int u2 = 4294967295; 
    unsigned int u3 = 2147483648; 
    unsigned int u4 = 2147483647;

}

提升补充部分:补码及位运算说明

验证真值

#include <iostream>
using namespace std;

//二进制转无符号整型
unsigned int B2U(unsigned int num)
{
   return (unsigned int)(num);
}
//二进制转有符号整型
int B2T(int num)
{
   return (int)(num); 
}

int main()
{
    cout << "------------- 验证真值------------------- -" << endl;

   
   cout << B2T(Ox00000000) << endl; 
   cout << B2T(OxFFFFFFFF) << endl; 
   cout << B2T(Ox80000000) << endl; 
   cout << B2T(Ox7FFFFFFF) << endl; 
   cout << endl;
   cout << B2U(Ox00000000) << endl; 
   cout << B2U(OxFFFFFFFF) << endl; 
   cout << B2U(Ox80000000) << endl; 
   cout << B2U(Ox7FFFFFFF) << endl;

}

为什么要用补码

只有加法运算器的情况下设计一种方法能计算减法?

我们对表进行修改:在计算机内部其实就是使用补码来构造这样一张映射表

关于位运算的一点补充说明

  • 注意:对有符号的数,尽可能不要使用右移运算,因为到底是逻辑右移还是算术右移取决于编译器。

声明:三二一的一的二|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 重学C++_运算符与表达式


三二一的一的二