操作符
计算机程序可以看作一串运算式,可以对各种运算类型进行运算。这种运算不仅仅是代数上的加减乘除,也可以是在计算机中存在的数据类型的改变,还可以是一种抽象的操作。比如说我们定义组装两个机械零件,那么我们也可以定义一种已知的操作“+”,使其能够表示组装零件的操作,总之,对于基本的整型、浮点数等的种种运算操作,我们都可以用操作符(Operator)来表示。操作符一般以一到两个特殊符号的形式出现。
每个操作符要完成运算需要的数据,也就是操作数。不同的操作符所需要的操作个数是不一样的,“+”只需要两个操作数,因此也称为二元操作符。除此之外,还有一元操作符和三元操作符分别需要一个和三个操作数。
操作数的类型会决定操作数的行为,例,“a+b”在a和b都是整数的情况下进行的是整数加法运算,而在a和b都是字符串的情况下进行的是字符串的连接。
1、算术操作符
算术操作符用在数学表达式中,基本都是一些数学中常用的运算符号。
对于这些操作符有几个需要注意的地方:
1.算数操作符都可以看做二元操作符操作两个操作数,其中“+”和“-”也可以作为数值的正负号,此时他们是一元操作符。
2.除法和取余数操作符可以看做一对一的互补的操作符,对于整数除法“5/2”来说,除法得到整数的商,而小数部分0.5直接去掉,或是直接通过“5%2”获得余数1.这里不存在四舍五入的问题,而是直接去掉小数部分。
3.取余操作不能对浮点数进行,至于“5%-2”这种带负数的取余,c++不同版本的标准对结果符号有着不同的规定,有的返回正数,有的返回负数,在实际编程中我们要以编程结果为准。
#include<iostream>
using namespace std;
//算术操作符
int main()
{
int a = 5 ;
int b = 2 ;
cout << "+ a :" << (+a) <<endl;
cout << "- a :" << (-a) <<endl;
cout << "a + b :" << (a+b) <<endl;
cout << "a - b :" << (a-b) <<endl;
cout << "a * b :" << (a*b) <<endl;
cout << "a / b :" << (a/b) <<endl;
cout << "a % b :" << (a%b) <<endl;
return 0;
}
可以看出,“+”作为取正符号时没有任何作用,“-”则会返回数字的相反数。
2、关系操作符
关系操作符用于比较数值的大小,这个概念与数学相同。不同的类型之间作比较会产生类型转换。对于浮点型来说“==”可能不太实用,因为他检查的是两个数完全相等,这在现实中是很少见的;如果两个数很接近,但是最后一个数不一样,比较相等就不会成功。
c++关系操作符
#include<iostream>
using namespace std;
//算术操作符
int main()
{
int a = 5;
int b = 2;
int one = 1;
bool t = true ;
cout <<"a>b :" << (a>b) <<endl;
cout <<"a<b :" << (a<b) <<endl;
cout <<"a>=b:" << (a>=b) <<endl;
cout <<"a<=b:" << (a<=b) <<endl;
cout <<"t==one :" << (t==one) <<endl;
cout <<"t!=one :" << (t!=one) <<endl;
return 0;
}
程序运行后,5和2的比较都在意料之内的,而true和1是相等的。这是因为布尔值在这里遇到了整数,会发生类型转换,布尔值两个字面值true和false对应的数值量就是1和0.因为比较的两者不是同一类型,因此在运行过程中会出现警告,在操作中将bool和int类型混合不安全。
3、逻辑操作符
逻辑操作符包含了基本的逻辑与、逻辑或、逻辑非三种操作,逻辑与和逻辑或是二元操作符,逻辑非是一元操作符。
c++逻辑操作符
逻辑操作符是结果为布尔类型的表达式,一般用于跟关系操作符复合组成的复杂逻辑表达式。当然其他类型也可以作为操作数转化为true和false,或者是1和0,但是在表达式中使用非1,非0的数值并不是恰当的做法。
//逻辑操作符
#include <iostream>
using namespace std;
//逻辑操作符
int main()
{
cout << "true && true : " << (true && true) << endl;
cout << "true && false :" << (true && false) << endl;
cout << "false && false:" << (false && false) << endl;
cout << "true || true : " << (true || true) << endl;
cout << "true || false :" << (true || false) << endl;
cout << "false || false:" << (false ||false) << endl;
cout << "! true : " << (! true ) << endl;
cout << "!false : " << (! false) << endl;
return 0;
}
例子展示了逻辑操作符对确定布尔值进行操作的各种可能结果。
//逻辑操作符与关系操作符的组合使用
#include<iostream>
using namespace std;
//逻辑操作符与关系操作符的组合使用
int main()
{
int a = 2;
int b = 5;
cout <<"a < 3 && b < 3 : " << (a < 3 && b < 3 ) << endl;
cout <<"a < 3 || b < 3 : " << (a < 3 || b < 3 ) << endl;
cout <<"a < 3 && !b < 3 : " << (a < 3 && !b < 3) << endl;
return 0;
}
由于 逻辑与 在一个操作数为false的情况下即为false,
逻辑或 在一个操作数为true的情况下即为true;对于类似“(a<b)||(c<d)”这样的表达式,只要a<b已经为true,那么右边的c<d也不需要计算了,这种逻辑的算数求值方式叫做短路求职。
//短路求值
#include <iostream>
using namespace std;
//短路求值
int main()
{
int a = 1;
if ( a < 2 || ( a = 2 ) )
{
cout <<"a的值为 :"<< a << endl;
}
return 0 ;
}
可以看到,由于逻辑操作符“||”左边是true,即使右边的赋值表达式没有执行,最后打印出来的a的值依然是初始值1.
4、位操作符
位操作符就是把整型看作二进制为的序列,然后然后对每个位分别进行位操作。由于二进制每个位只可能是0或1,因此一些类似逻辑操作的运算可以运用在每一位上,也就是位与、位或、位求反和位异或。
//c++位操作符
//位与、位或、位异或、在不同二进制数值组合下的运算结果:
除此之外,位求反就是简单的将0变成1,将1变成0.
//位操作符
#include <iostream>
using namespace std;
//位操作符
int main()
{
int a = 1; //0b01
int b = 3; //0b11
cout <<"a & b: " << (a & b) << endl;
cout <<"a | b: " << (a | b) << endl;
cout <<"a ^ b: " << (a ^ b) << endl;
cout <<"~a : " << (~a) << endl;
return 0;
}
程序的注释中标注了数字的二进制形式,分别是01和11.可以看到由于两个数的高一位并不都是1,因此位与的结果是0,而低一位都是1,所以结果是1,和在一起是01,也就是十进制的1.其他的以此类推。位或:二进制11,十进制3;位异或:二进制 10,十进制 2;位求反:二进制10,十进制2.
//左移和右移符操作符
左移和右移操作符就是把整型的每一位都左移或右移,例无符号二进制数01001001b,左移一位,右边补0,在左移一位,最左边的1才会移除,右移则相反。
#include<iostream>
using namespace std;
//左移和右移操作符
int main()
{
unsigned int a = 4;
cout << "a << 1: " << (a<<1) << endl;
cout << "a >> 1: " << (a>>1) << endl;
return 0;
}
输出结果为:a<<1 :8 ; a>>1 :2
5、自增自减操作符
//自增自减操作符
#include<iostream>
using namespace std;
//自增自减操作符
int main()
{
int a = 2 ;
cout << "a = " << a << endl;
cout << "++a=" << ++a << endl;
cout << "a++=" << a++ << endl;
cout << "--a=" << --a << endl;
cout << "a--=" << a-- << endl;
return 0;
}
结果 :
这个结果可能会让人感到困惑,为什么a经过了两次递增,两次递减,结果却是3呢?
这是因为在a++之后先返回了原来a的值3,再加一个成为4,之后自减由于是–在前,则4-1成为3后返回给了cout,最后一个a–与a++类似,返回3的a的最终值为2.
6、赋值操作符
//赋值操作符
赋值操作符中,除了第一个“=”是基本操作符外,其他的都是与各种操作符复合而成的复合赋值操作符,以“a+=b”为例,他是“a=a+b”的缩写。
#include<iostream>
using namespace std;
//赋值操作符
int main()
{
int a = 3 ;
int b = 2 ;
cout << "a += b:" << (a += b) <<endl;
cout << "a -= b:" << (a -= b) <<endl;
cout << "a *= b:" << (a *= b) <<endl;
cout << "a /= b:" << (a /= b) <<endl;
cout << "a %= b:" << (a %= b) <<endl;
cout << "a <<=b:" << (a <<=b) <<endl;
cout << "a >>=b:" << (a >>=b) <<endl;
cout << "a &= b:" << (a &= b) <<endl;
cout << "a ^= b:" << (a ^= b) <<endl;
cout << "a != b:" << (a != b) <<endl;
return 0;
}
结果:
7、条件操作符
//条件操作符
条件操作符是一个三元操作符,也是c++中唯一一个三元操作符。
例
#include<iostream>
using namespace std;
//条件赋值符
int main()
{
int a = 3 ;
int b = 2 ;
int c = 5 ;
int max = a > b ? a : b ;
int min = a < c ? a : c ;
cout << "max : " << max << endl;
cout << "min : " << min << endl;
return 0;
}
由例子可以看出,条件符由“?”和“:”两部分组成。“?”前面是一个结果为布尔表达式,而“:”前后则是这个条件为true和false时条件操作符会返回的表达式。此外由于“:”的前后没有什么限制,我们甚至可以嵌套另一个含条件操作符的表达式来进行更复杂的判断。
#include <iostream>
using namespace std;
//嵌套条件操作符
int main()
{
int a = 3 ;
int b = 2 ;
int c = 5 ;
int max = a > b ? (a > c ? a : c) : (b > c ? b : c);
int min = a < b ? (a < c ? a : c) : (b < c ? b : c);
cout <<"max :" << max << endl;
cout <<"min :" << min << endl;
return 0;
}
结果:
8、逗号操作符
//逗号操作符
#include<iostream>
using namespace std;
//逗号操作符
int main()
{
int a = 3 ;
int b = 2 ;
int c = 5 ;
int result = (c = b,b--,a++);
cout <<"c =" << c <<endl;
cout <<"b =" << b <<endl;
cout <<"a =" << a <<endl;
cout <<"result:" << result <<endl;
return 0;
}
结果:
逗号操作符的操作数不一定得是变量或者是赋值表达式,也可以是其他表达式。
9、操作符优先级
相关资料可见:https://blog.youkuaiyun.com/qq_41565359/article/details/113878104
#include <iostream>
using namespace std;
//操作符优先级
int main()
{
int a = 3;
int b = 2;
//((a+b)<(a-(b*0))) || (a>b)
if (a+b < a-b*0 || a>b)
{
cout << "条件成立!" <<endl;
}
return 0;
}
//右结合性
#include<iostream>
using namespace std;
//右结合性
int main()
{
int a = 3;
int b = 3;
//c=(b=a+1)
//如果是左结合性,等价于(c=b)=a+1
int c = b = a + 1;
cout << "c:"<<c <<endl;
return 0;
}
这是右结合性,运行结果为c=4,这是因为右边的赋值先操作,b等于4以后在复制给c.如果是左结合性的情况,b的初始值3就会先赋值给c.
如果本文对您有帮助,请点赞支持一下~