4.1 认识运算符
微视频
运算符是一种告知编译器执行特定的数学或逻辑操作的符号。C++语言内置了丰富的运算符,主要包括算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符等。
4.1.1 算术运算符
C++语言中的算术运算符是用来处理四则运算的符号,也是最简单、最常用的符号,尤其是数字的处理几乎都会用到运算符。如表4-1所示,列出了C++语言中常用的算术运算符(这里假设变量A的值为10,变量B的值为20)。
表4-1 算术运算符
【实例4.1】计算数值21与10的和、差、积、商、余数等(源代码\ch04\4.1.txt)。
#include <iostream> using namespace std; int main() { int a = 21; int b = 10; int c ; c = a + b; cout << "第1行a+b:c的值是"<<c<<endl; c = a - b; cout << "第2行a-b:c的值是"<<c<<endl; c = a * b; cout << "第3行a*b:c的值是"<<c<<endl; c = a / b; cout << "第4行a/b:c的值是"<<c<<endl; c = a % b; cout << "第5行a%b:c的值是"<<c<<endl; c = a++; //赋值后再加1,c为21,a为22 cout << "第6行a++:c的值是"<<c<<endl; c = a--; //赋值后再减1,c为22,a为21 cout << "第7行a--:c的值是"<<c<<endl; }
程序运行结果如图4-1所示。
图4-1 例4.1的程序运行结果
4.1.2 自增、自减运算符
在C++中,提供了两个比较特殊的运算符:自增运算符++和自减运算符--。自增、自减运算符又分为前缀和后缀。当++或--运算符置于变量的左边时,称为前置运算或称为前缀,表示先进行自增或自减运算,再使用变量的值。而当++或--运算符置于变量的右边时,称为后置运算或后缀,表示先使用变量的值,再进行自增或自减运算。前置与后置运算方法如表4-2所示(这里假设参与计算的变量为a和b,并且a的值为5)。
表4-2 自增、自减运算符的前置与后置
【实例4.2】编写程序,定义int型变量x和y,分别对x做前置运算和后置运算,将运算结果赋予y,然后分别输出x和y的值(源代码\ch04\4.2.txt)。
#include <iostream> using namespace std; int main() { int x,y; /* 后置运算 */ cout << " x++、x--均先赋值后运算:"<<endl; x = 5; y = x++; cout <<"y="<<y <<endl; cout <<"x="<<x <<endl; x = 5; y = x--; cout <<"y="<<y <<endl; cout <<"x="<<x <<endl; /* 前置运算 */ cout <<"++x、--x均先运算后赋值:" <<endl; x = 5; y = ++x; cout <<"y="<<y <<endl; cout <<"x="<<x <<endl; x = 5; y = --x; cout <<"y="<<y <<endl; cout <<"x="<<x <<endl; }
程序运行结果如图4-2所示。在本实例中,y=x++表示先将x值赋予y,再对x进行自增运算;y=++x表示先将x进行自增运算,再将x值赋予y;y=x--表示先将x值赋予y,再对x进行自减运算;y=--x表示先将x进行自减运算,再将x值赋予y。
图4-2 例4.2的程序运行结果
4.1.3 关系运算符
关系运算可以被理解为一种“判断”,判断的结果要么是“真”,要么是“假”。C++语言中规定关系运算符的优先级低于算术运算符,且高于赋值运算符。C++语言中定义的关系运算符如表4-3所示(这里假设变量A的值为10,变量B的值为20)。
表4-3 关系运算符
☆大牛提醒☆
关系运算符中的等于号“==”很容易与赋值号“=”混淆,一定要记住,“=”是赋值运算符,而“==”是关系运算符。
【实例4.3】使用关系运算符判断数值5与6的关系(源代码\ch04\4.3.txt)。
#include <iostream> using namespace std; int main() { int a = 5; int b = 6; if(a == b) { cout << "第1行 : a等于b " << endl; } else { cout << "第1行 : a不等于b " << endl; } if(a < b) { cout << "第2行 : a小于b " << endl; } else { cout << "第2行 : a不小于b " << endl; } if(a > b) { cout << "第3行 : a大于b " << endl; } else { cout << "第3行 : a不大于b " << endl; } /* 改变 a 和 b 的值 */ a = 7; b = 8; if(a <= b) { cout << "第4行 : a小于或等于b " << endl; } if(b >= a) { cout << "第5行 : b大于或等于a" << endl; } }
程序运行结果如图4-3所示。
图4-3 例4.3的程序运行结果
4.1.4 逻辑运算符
C++语言为用户提供了逻辑运算符,包括逻辑与、逻辑或、逻辑非3种逻辑运算符。逻辑运算符两侧的操作数需要转换成布尔值进行运算。逻辑与和逻辑非都是二元运算符,要求有两个操作数,而逻辑非为一元运算符,只有一个操作数。
如表4-4所示,列出了C++语言支持的逻辑运算符(这里假设变量A的值为1,变量B的值为0)。
表4-4 逻辑运算符
为了方便掌握逻辑运算符的使用,逻辑运算符的运算结果可以用逻辑运算的“真值表”来表示,如表4-5所示。
表4-5 真值表
☆大牛提醒☆
逻辑运算符与关系运算符的返回结果一样,分为“真”与“假”两种,“真”为“1”,“假”为“0”。
【实例4.4】使用逻辑运算符判断数值5与6的关系(源代码\ch04\4.4.txt)。
#include <iostream> using namespace std; int main() { int a = 5; int b = 6; int c ; if( a && b ) { cout << "第1行:条件为真 " << endl; } if( a || b ) { cout << "第2行:条件为真 " << endl; } /* 改变a和b的值*/ a = 0; b = 10; if( a && b ) { cout << "第3行:条件为真 " << endl; } else { cout << "第3行:条件为假" << endl; } if( !(a && b) ) { cout << "第4行:条件为真" << endl; } }
程序运行结果如图4-4所示。
图4-4 例4.4的程序运行结果
4.1.5 赋值运算符
赋值运算符为二元运算符,要求运算符两侧的操作数类型必须一致(或者右边的操作数必须可以隐式转换为左边操作数的类型)。C++语言中提供的简单赋值运算符如表4-6所示。
表4-6 赋值运算符
【实例4.5】使用赋值运算符对5进行赋值运算(源代码\ch04\4.5.txt)。
#include <iostream> using namespace std; int main() { int a = 5; int c ; c = a; cout <<"第1行:= 运算符实例,c 的值 ="<< c<<endl; c += a; cout <<"第2行:+= 运算符实例,c 的值 ="<< c<<endl; c -= a; cout <<"第3行:-= 运算符实例,c 的值 ="<< c<<endl; c *= a; cout <<"第4行:*= 运算符实例,c 的值 = "<< c<<endl; c /= a; cout <<"第5行:/= 运算符实例,c 的值 = "<< c<<endl; c = 100; c %= a; cout <<"第6行:%= 运算符实例,c 的值 ="<< c<<endl; c <<= 2; cout <<"第7行:<<= 运算符实例,c 的值 ="<< c<<endl; c >>= 2; cout <<"第8行:>>= 运算符实例,c 的值 ="<< c<<endl; c &= 2; cout <<"第9行:&= 运算符实例,c 的值 ="<< c<<endl; c ^= 2; cout <<"第10行:^= 运算符实例,c 的值 ="<< c<<endl; c |= 2; cout <<"第11行:|= 运算符实例,c 的值 ="<< c<<endl; }
程序运行结果如图4-5所示。
图4-5 例4.5的程序运行结果
☆大牛提醒☆
在书写复合赋值运算符时,两个符号之间一定不能有空格,否则将会出错。
4.1.6 位运算符
任何信息在计算机中都是以二进制的形式保存的,位运算符是对数据按二进制位进行运算的运算符。C++语言中提供的位运算符如表4-7所示(这里假设变量A的值为60,变量B的值为13)。
表4-7 位运算符
【实例4.6】使用位运算符对数值60和13进行位运算(源代码\ch04\4.6.txt)。
#include <iostream> using namespace std; int main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("第1行:c 的值是 %d\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("第2行:c 的值是 %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("第3行:c 的值是 %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("第4行:c 的值是 %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("第5行:c 的值是 %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("第6行:c 的值是 %d\n", c ); }
程序运行结果如图4-6所示。
图4-6 例4.6的程序运行结果
4.1.7 杂项运算符
在C++语言中,除了算术运算符、关系运算符、逻辑运算符等,还有其他一些重要的运算符,如表4-8所示。
表4-8 杂项运算符
【实例4.7】杂项运算符的应用(源代码\ch04\4.7.txt)。
#include <iostream> using namespace std; int main() { int a = 4; short b; double c; int *ptr; /* sizeof()运算符实例 */ printf(第1行:变量 a 的大小 = %lu\n", sizeof(a) ); printf(第2行:变量 b 的大小 = %lu\n", sizeof(b) ); printf(第3行:变量 c 的大小 = %lu\n", sizeof(c) ); /* & 和 * 运算符实例 */ ptr = &a; /* ptr包含a的地址 */ printf("a 的值是 %d\n", a); printf("*ptr 是 %d\n", *ptr); /* 三元运算符实例 */ a = 10; b = (a == 1) ? 20:30; printf( "b 的值是 %d\n", b ); b = (a == 10) ? 20:30; printf( "b 的值是 %d\n", b ); }
程序运行结果如图4-7所示。
图4-7 例4.7的程序运行结果
4.1.8 逗号运算符
C++提供一种特殊的运算符—逗号运算符,用它可以将两个表达式连接起来。逗号运算符是优先级最低的运算符,它可以使多个表达式放在一行上,从而大大简化了程序。逗号表达式又称为顺序求值运算符。逗号表达式的一般格式如下:
表达式1,表达式2
逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
注意:程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
一般情况下,使用逗号运算符来进行多个变量的初始化或者执行多个自增语句。然而,逗号表达式是可以作为任意表达式的一部分的。它用于把多个表达式连接起来,用逗号进行分隔的表达式列表的值就是其中最右边表达式的值,其他表达式的值都会被丢弃。这就意味着最右边表达式的值就是整个逗号表达式的值。
下面通过一个实例来说明逗号运算符的使用方法。
【实例4.8】逗号运算符的应用(源代码\ch04\4.8.txt)。
#include <iostream> using namespace std; int main() { int i, j; j = 10; i = ( j++, j+100, 999+j ); cout << i<<endl; }
程序运行代码如图4-8所示。在本实例中,首先定义了两个int型变量i和j,给j赋值为10,接着j自增到11,然后把j和100相加,最后把j(j的值仍为11)和999相加,这样最终的结果就是1010。从运行结果来看,使用逗号运算符把i和j的值隔开,实现了逗号运算符顺序求值的过程。
图4-8 例4.8的程序运行结果