C语言运算符与表达式

算术运算符

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循环的初始化和更新部分,可以同时更新多个变量。

在表达式中: 逗号运算符可以在单个语句中计算多个表达式

在宏定义中: 逗号运算符可以用于复杂的宏定义,确保多个操作在一条语句中执行。

逗号运算符的优先级和结合性

逗号运算符的优先级最低,其结合性为左结合性。这意味着在包含多个逗号运算符的表达式中,计算顺序是从左到右。

逗号运算符与函数参数

逗号运算符在函数参数列表中与逗号分隔参数的用法不同。函数参数列表中的逗号仅仅是参数分隔符,不是运算符。

逗号运算符的副作用

逗号运算符会依次计算其左边和右边的表达式,并且保证每个表达式都会被计算,即使它们有副作用。

  • 35
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值