C++中的算术运算符(新手必看)
C++ 中的运算符多数继承自 C语言,根据操作数的数量,运算符可分为单目运算符、双目运算符和三目运算符。
C++ 的算术运算符包括 4 个单目运算符(取正值、取负值、自增、自减)和 5 个双目运算符(加法、减法、乘法、除法和求余),如下表所示。
expr 表示使用运算符的对象,可以是表达式、变量或常量。
其中:
注意,表达式求值时,会按照运算符的优先级别从高到低依次执行:
当算术运算符的优先级相同时,结合方向为“自左向右”。这和数学中的计算顺序是一样的。
1) 若所有操作数的数据类型相同,则表达式运算结果的数据类型和操作数的数据类型相同。例如,两个整型数相加,其结果仍然是一个整型数。
2) 若操作数的数据类型不同,则表达式运算结果的数据类型取最高的数据类型,以保证数据精度不发生损失。例如,混合运算 10+'a'−1.5+3.2*6 中出现了整型、字符型、浮点型,表达式的运算结果是浮点型。
自增、自减运算符可以放在变量的前面,如 ++expr、--expr,这种情况称为前缀运算;也可以放在变量的后面,如 expr++ 和 expr--,这种情况称为后缀运算。
两者对运算结果的影响是不一样的:
当自增、自减运算符出现在表达式内部,作为运算的一部分时,前缀和后缀的运算结果差异很大:
C++ 的算术运算符包括 4 个单目运算符(取正值、取负值、自增、自减)和 5 个双目运算符(加法、减法、乘法、除法和求余),如下表所示。
运算符 | 功能 | 目数 | 用法 | 示例 |
---|---|---|---|---|
+ | 取正值 | 单目 | +100 | +100 |
+ | 加法运算 | 双目 | expr1 + expr2 | 100+5、x+y、i+1 |
- | 取负值 | 单目 | -100 | -100 |
- | 减法运算 | 双目 | expr1 - expr2 | 100-5、x-y、j-1 |
* | 乘法运算 | 双目 | expr1 * expr2 | 2*3、x*y、2*x |
/ | 除法运算 | 双目 | expr1 / expr2 | 2/3、0/2、x/y |
% | 求余(取模)运算 | 双目 | expr1 % expr2 | 5%2、x%y |
++ | 自增 | 单目 | expr++,++expr | i++、++i |
-- | 自减 | 单目 | expr--,--expr | i--、--i |
expr 表示使用运算符的对象,可以是表达式、变量或常量。
其中:
- “+”、“−”作为加法和减法运算符用时为双目运算符,作为正值、负值运算符用时为单目运算符;
- 求余运算符“%”用于计算两个整数相除得到的余数,运算符的两侧均为整数,如 7%4 的结果是 3;
- 使用除法运算符“/”时,除数不能为 0,否则会产生溢出,处理器抛出异常;
- 自增运算符“++”和自减运算符“−−”对变量的操作效果分别是使变量增加 1 和减少 1。
注意,表达式求值时,会按照运算符的优先级别从高到低依次执行:
- 单目正和单目负的优先级最高;
- “*”、“/”、“%”的优先级高于“+”、“−”;
- 括号在所有运算符中优先级最高,可以改变运算顺序。
当算术运算符的优先级相同时,结合方向为“自左向右”。这和数学中的计算顺序是一样的。
C++算术表达式
使用算术运算符的表达式称为算术表达式,例如:(3+5)/Rate Top-Bottom+1 Height * Width进行四则混合运算时,不同的数据类型会先自动转换成同一类型,然后再进行运算。
1) 若所有操作数的数据类型相同,则表达式运算结果的数据类型和操作数的数据类型相同。例如,两个整型数相加,其结果仍然是一个整型数。
2) 若操作数的数据类型不同,则表达式运算结果的数据类型取最高的数据类型,以保证数据精度不发生损失。例如,混合运算 10+'a'−1.5+3.2*6 中出现了整型、字符型、浮点型,表达式的运算结果是浮点型。
C++自增、自减运算符
自增运算符“++”和自减运算符“−−”对变量的操作效果分别是使变量增加 1 和减少 1。自增、自减运算符可以放在变量的前面,如 ++expr、--expr,这种情况称为前缀运算;也可以放在变量的后面,如 expr++ 和 expr--,这种情况称为后缀运算。
两者对运算结果的影响是不一样的:
- 前缀运算中,变量先完成自增或自减运算,再以增减后的结果参与表达式运算;
- 后缀运算中,变量先参加表达式运算,之后再进行自增或自减。
当自增、自减运算符出现在表达式内部,作为运算的一部分时,前缀和后缀的运算结果差异很大:
int a=1,b=1; int c,d; c=a++; // a先赋值再自增,c 为 1 d=++b; // b先自增再赋值,d 为 2上述代码中,a、b 都被赋予初值 1,c 的结果为 1,d 的结果为 2。这是因为代码“c=a++;”中,a 先进行自增运算,变为 2,然后将 2 赋给 b;代码“d=++b;”中,b 先进行赋值操作,d 得到赋值 1,然后 b 进行自增操作,变为 2。读者要仔细体会其中的差别。