(10)C++ 运算符

本文详细介绍了C++中的算术、关系、逻辑、位、赋值等运算符,包括其用法、特性和陷阱,如int的除法陷阱、逻辑运算符的短路特性以及运算符优先级等。
摘要由CSDN通过智能技术生成


运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符,并提供了以下类型的运算符:

算术运算符,关系运算符,逻辑运算符,位运算符赋值运算符,杂项运算符

本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。

算术运算符

下表显示了 C++ 支持的算术运算符。

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
自减运算符,整数值减少 1 A-- 将得到 9

请看下面的实例,了解 C++ 中可用的算术运算符。

#include <iostream>
using namespace std;
 
int main()
{
   
   int a = 21;
   int b = 10;
   int c;
 
   c = a + b;
   cout << "Line 1 - c 的值是 " << c << endl ;
   c = a - b;
   cout << "Line 2 - c 的值是 " << c << endl ;
   c = a * b;
   cout << "Line 3 - c 的值是 " << c << endl ;
   c = a / b;
   cout << "Line 4 - c 的值是 " << c << endl ;
   c = a % b;
   cout << "Line 5 - c 的值是 " << c << endl ;
 
   int d = 10;   //  测试自增、自减
   c = d++;
   cout << "Line 6 - c 的值是 " << c << endl ;
 
   d = 10;    // 重新赋值
   c = d--;
   cout << "Line 7 - c 的值是 " << c << endl ;
   return 0;
}

当上面的代码被编译和执行时,它会产生以下结果:

Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 10
Line 7 - c 的值是 10

int 的除法陷阱

在工作中遇到了一个 int 的陷阱:当除数和被除数都是整型数据时,得到的结果也是整型数据,它将小数部分舍去,相当于求模运算。

实例 1:余数小于 0. 5 时:

int N=819;
std::cout<<N/12<<std::endl;
std::cout<<N/12.0<<std::endl;

输出:

68
68.25

实例 2:余数大于 0.5 时:

int N=819;
std::cout<<N/10<<std::endl;
std::cout<<N/10.0<<std::endl;

输出:

81
81.9

除法/和求模%及指针

除法/和求模%若两个操作数是正数,则除法的结果是正数,求模的结果也是正数若两个操作数是负数,则除法的结果是正数,求模的结果是负数若只有一个操作数是负数,则除法和求模的结果取决于机器,除法可以确定结果是负数逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数,只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数区分 if(i<j<k) 和 if(i<j && j<k)第一个i<j或者为0或者为1,只要k大于1,表达式就为true第二个必须i<j且j<k表达式才为true区分 if(val) 和 if(val == true)第一个只要val非零则表达式为true,val为0则表达式为false第二个只有val为1表达式为true,val非1则表达式为false

int val = 2;
if(val==true){
                 //不会进入if
  cout<<"val==true"<<endl;
}

多个赋值操作符中,各对象必须具有相同的数据类型,或者具有可转换为同一类型的数据类型。

int ival; int *pval;
ival = pval = 0;  //error 尽管ival和pval都可以赋值为0
string s1,s2;
s1 = s2 = "OK"    //ok

如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。

通常编译器不能断定一个指针是否指向动态对象,因此尽管这样做是错误的,但在大部分编译器上仍能运行通过,但是会产生运行时错误。整形提升

对于所有比int小的整形(char, signed char, unsigned char, short, unsigned short),如过该类型所有可能值都包含在int中,他们会被提升为int型,否则,他们将被提升为unsigned int。

对于包含signed和unsigned int型的表达式,表达式中的signed型整数会被转换为unsigned型。

int i = -5;
unsigned int ii = 1;
cout<<(i>ii)<<endl;   //输出1,非常有趣的结果 原因是int型的i转换为unsigned int型
short i = -5;
unsigned short ii = 1;
cout<<(i>ii)<<endl;  //输出0 比较时short和unsigned short都提升为int型

关系运算符

下表显示了 C++ 支持的关系运算符。

假设变量 A 的值为 10,变量 B 的值为 20,则:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值