算术运算符
1.加 +
用于将两个操作数相加。 可用于整数和浮点数类型。
2.减 -
用于将第二个操作数从第一个操作数中减去。 可用于整数和浮点数类型。
3.乘 *
用于将两个操作数相乘。 可用于整数和浮点数类型。
4.除 /
用于将第一个操作数除以第二个操作数。 整数除法:当两个操作数都为整数时,执行整数除法,结果为整数(舍去小数部分)。 浮点数除法:当至少有一个操作数为浮点数时,执行浮点数除法,结果为浮点数。
5.取余 %
用于计算第一个操作数除以第二个操作数的余数。 只能用于整数类型。
6.实现
关系运算符
概念
关系运算符用于比较两个值之间的关系,并返回一个布尔值(真(1)或假(0))
相等 ==
判断两个操作数是否相等 如果相等,则返回真(非零);否则返回假(零) 可用于所有基本数据类型的比较,包括整数、浮点数和字符
不相等 !=
判断两个操作数是否不相等。 如果不相等,则返回真(非零);否则返回假(零)。 可用于所有基本数据类型的比较,包括整数、浮点数和字符。
大于 >
判断第一个操作数是否大于第二个操作数。 如果第一个操作数大于第二个操作数,则返回真(非零);否则返回假(零)。 可用于所有基本数据类型的比较,包括整数、浮点数和字符。
小于 <
判断第一个操作数是否小于第二个操作数。 如果第一个操作数小于第二个操作数,则返回真(非零);否则返回假(零)。 可用于所有基本数据类型的比较,包括整数、浮点数和字符。
大于等于 >=
判断第一个操作数是否大于或等于第二个操作数。 如果第一个操作数大于或等于第二个操作数,则返回真(非零);否则返回假(零)。 可用于所有基本数据类型的比较,包括整数、浮点数和字符。
小于等于 <=
判断第一个操作数是否小于或等于第二个操作数。 如果第一个操作数小于或等于第二个操作数,则返回真(非零);否则返回假(零)。 可用于所有基本数据类型的比较,包括整数、浮点数和字符。
实现
逻辑运算符
逻辑与 &&
当且仅当两个操作数都为真时,逻辑与运算结果才为真。 如果两个操作数都为真,则返回真(非零);否则返回假(零)。 如果第一个操作数为假,第二个操作数将不会被求值(短路求值)。
逻辑或 ||
当两个操作数中至少有一个为真时,逻辑或运算结果为真。 如果两个操作数中至少有一个为真,则返回真(非零);否则返回假(零)。 如果第一个操作数为真,第二个操作数将不会被求值(短路求值)。
逻辑非 !
逻辑非运算符用于求取操作数的逻辑反。 如果操作数为真,则返回假(零);如果操作数为假,则返回真(非零)。 逻辑非运算符是单目运算符,只操作一个操作数。
位运算符
原码、反码和补码 原码
正数的原反补相同 负数的原码变补码 : 反码=原码取反 补码=反码加(+)1
负数的处理(补码变原码):取反:将补码的所有位取反。 加1:将取反后的结果加1,即得到原码的绝对值部分。 恢复符号:将符号位重新设为1,以表示负数。
按位与 &
对两个操作数的每一位执行与操作,如果两个操作数的对应位都为1,则结果位为1,否则为0。
按位或 |
对两个操作数的每一位执行或操作,如果两个操作数的对应位有一个为1,则结果位为1,否则为0。
按位异或 ^
对两个操作数的每一位执行异或操作,如果两个操作数的对应位不相同,则结果位为1,否则为0。
^ 按(2进制)位异或 异或:相同为0,相异位1
按位取反 ~
对操作数的每一位执行取反操作,将每个0变为1,将每个1变为0。
“~”把0变1 把1变0 全变
左移 <<
将操作数的所有位向左移动指定的位数,低位用0填充,相当于将操作数乘以2的移动位数次幂。
操作数乘以2的移动位数次幂
右移 >>
将操作数的所有位向右移动指定的位数,高位用0或者符号位填充,相当于将操作数除以2的移动位数次幂。
操作数除以2的移动位数次幂。
注意
位运算符通常用于对二进制数进行位级别的操作。 右移运算符 >> 的行为依赖于操作数的类型:对于无符号类型,使用逻辑右移,对于有符号类型,使用算术右移。 左移运算符 << 不会导致溢出,但是右移运算符 >> 可能会导致溢出。 位运算符的优先级较低,可以使用括号来明确运算次序。
赋值运算符
简单赋值 =
将右侧的值赋给左侧的变量或表达式。 赋值运算符的左侧必须是一个可修改的对象,例如变量或数组元素
复合赋值
加法赋值 += a += b 相当于(a = a + b) :将左侧的值与右侧的值相加,并将结果赋给左侧。
减法赋值 -= a -= b 相当于(a = a - b) :将左侧的值减去右侧的值,并将结果赋给左侧。
乘法赋值 *= a *= b 相当于(a = a * b) :将左侧的值乘以右侧的值,并将结果赋给左侧。
除法赋值 /= a /= b 相当于(a = a / b) :将左侧的值除以右侧的值,并将结果赋给左侧。
取模赋值 %= a %= b 相当于(a = a % b) :将左侧的值取模右侧的值,并将结果赋给左侧。
按位与赋值 &= a &= b 相当于(a = a & b) :将左侧的值按位与右侧的值,并将结果赋给左侧。
按位异或赋值 ^= a ^= b 相当于(a = a ^b):将左侧的值按位异或右侧的值,并将结果赋给左侧。
左移赋值 <<= a <<= b 相当于(a = a <<b):将左侧的值左移右侧的位数,并将结果赋给左侧。
右移赋值 >>= a <<= b 相当于(a = a <<b):将左侧的值右移右侧的位数,并将结果赋给左侧。
自增自减运算符
自增运算符(++)
前缀形式:++var 或者 ++expression。 先对变量 var 或者 expression 进行自增操作,然后返回增加后的值。 后缀形式:var++ 或者 expression++。 先返回变量 var 或者 expression 的值,然后再进行自增操作。
自减运算符(--)
前缀形式:--var 或者 --expression。 先对变量 var 或者 expression 进行自减操作,然后返回减少后的值。 后缀形式:var-- 或者 expression--。 先返回变量 var 或者 expression 的值,然后再进行自减操作。
注意事项
自增和自减运算符只能应用于可修改的左值(lvalue)。 在前缀形式下,先执行增加或减少操作,然后返回变量的值。在后缀形式下,先返回变量的值,然后再执行增加或减少操作。 可以使用自增和自减运算符来实现循环和迭代递增/递减的操作,以及简化代码。
条件运算符
三目运算符
condition 是一个条件表达式,如果条件为真(非零),则返回 expression1 的值;如果条件为假(零),则返回 expression2 的值。
condition ? expression1 : expression2
条件运算符是右结合性的,即从右向左进行结合。 条件运算符是一个表达式,因此它可以作为语句的一部分,也可以在赋值语句中使用。 条件运算符经常用于简单的条件分支,但不应该滥用,以免降低代码的可读性。
运算符优先级和结合性
运算符优先级
运算符优先级决定了运算符在表达式中执行的顺序。优先级高的运算符先于优先级低的运算符进行计算。下面是常见运算符的优先级表(从高到低):
括号: () - 最高优先级,确保括号内的表达式优先计算。
指数: ** - 在一些编程语言(如 Python)中使用。
正负号: +x, -x - 一元运算符,表示正负数。
乘法、除法和取模: *, /, %
加法和减法: +, -
位移运算: <<, >>
关系运算: <, <=, >, >=
等号运算: ==, !=
按位与: &
按位异或: ^
按位或: |
逻辑与: &&
(在 C 语言等) 逻辑或: ||
(在 C 语言等) 条件运算符: ?: - 三元运算符。
赋值运算符: =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
逗号运算符: ,
- 最低优先级。
运算符结合性
结合性决定了当具有相同优先级的运算符出现在表达式中时,运算的执行顺序。结合性有两种类型: 左结合性:从左到右计算。大多数二元运算符(如 +, -, *, /, %, <, >, == 等)都是左结合的。例如,表达式 a - b + c 先计算 a - b,再计算结果加上 c。 右结合性:从右到左计算。赋值运算符(如 =, +=, -= 等)和一些其他运算符(如三元运算符 ?:,指数运算符 **)是右结合的。例如,表达式 a = b = c 先计算 b = c,然后将结果赋值给 a。
括号: () - 最高优先级。
一元运算符: +, -, ++, --, !, ~ - 右结合性。
乘法、除法和取模: *, /, % - 左结合性。
加法和减法: +, - - 左结合性。
位移运算: <<, >> - 左结合性。
关系运算: <, <=, >, >= - 左结合性。
等号运算: ==, != - 左结合性。
按位与: & - 左结合性。
按位异或: ^ - 左结合性。
按位或: | - 左结合性。
逻辑与: && - 左结合性。
逻辑或: || - 左结合性。
条件运算符: ?: - 右结合性。
赋值运算符: =, +=, -=, *=, /=, %= - 右结合性。
逗号运算符: , - 最低优先级,左结合性。
逗号运算符
逗号运算符简介
逗号运算符(,)允许在一个语句中执行多个表达式,并返回最后一个表达式的值。它是一种二元运算符,且其优先级较低。
使用逗号运算符的场景
在for循环中: 逗号运算符常用于for循环的初始化和更新部分,可以同时更新多个变量。
在表达式中: 逗号运算符可以在单个语句中计算多个表达式
在宏定义中: 逗号运算符可以用于复杂的宏定义,确保多个操作在一条语句中执行。
逗号运算符的优先级和结合性
逗号运算符的优先级最低,其结合性为左结合性。这意味着在包含多个逗号运算符的表达式中,计算顺序是从左到右。
逗号运算符与函数参数
逗号运算符在函数参数列表中与逗号分隔参数的用法不同。函数参数列表中的逗号仅仅是参数分隔符,不是运算符。
逗号运算符的副作用
逗号运算符会依次计算其左边和右边的表达式,并且保证每个表达式都会被计算,即使它们有副作用。