C语言运算符

1、算术运算符

运算符

功能说明

举例

+

加法(一目、双目)

+100 , a+b

-

减法(一目、双目)

-100, a-b

*

乘法(双目)

a*b

/

除法(双目)

a/b

%

取模、求余(双目)

a%b

++

自加1(单目)

++a , a++

--

自减1(单目)

--a , a--

  • 关注点:
    • 减号也是负号,比如 -a 是取变量 a 的相反数。
    • 取模运算要求左右两边操作数必须是整型数据
    • 自加和自减运算不仅可以对整型操作,也可以对浮点数、指针操作。
  • 前缀自加自减运算:先进行自加自减,再参与表达式运算
  • 后缀自加自减运算:先参与表达式运算在进行自加自减
int a = 100;
int b = 200;

int c = ++a; // a先自加1,变成101;然后再赋值给c,因此c等于101
int d = b++; // b先赋值给d,因此d等于200;然后b自加1,变成201

2、 关系运算符

运算符

功能

举例

说明

>

判断是否大于

a>b

判断a是否大于b

判断是否小于

a

判断a是否小于b

>=

判断是否大于或等于

a>=b

判断a是否大于或等于b

判断是否小于或等于

a

判断a是否小于或等于b

!=

判断是否不等于

a!=b

表示a是否不等于b

==

判断是否等于

a==b

表示a是否等于b

  • 关注点:
    • 关系运算符用于判断运算符两边的表达式是否满足给定的大小条件。
    • 由关系运算符组成的表达式称为关系表达式,其值为布尔型。
    • 判断是否相等是双等号==,而不是一个等号。
if (a = 3)
if (3 = a)

3、 逻辑运算符

运算符

功能说明

举例

!

逻辑反

!(x==0)

&&

逻辑与

x>0 && x

||

逻辑或

y100

  • 运算规则:
    • 逻辑反:将逻辑真、假翻转,即真变假,假变真。
    • 逻辑与:将两个或多个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
    • 逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假

  • 特殊规则:
    • 在逻辑与运算中,如果左边表达式的值为假,那么右边表达式将不被执行
      • 逻辑与中如果出现多个表达式,那么会从左往右依次判断,当出现第一个为假的表达式则停止判断,后面的表达式不会被执行。
int a = 3 ;
int b = 1 ;
if( a < 20 && b=200  && 500 < 400 && a = 998   );
a=3
b=1 
    • 在逻辑或运算中,如果左边表达式的值为真,那么右边表达式将不被执行
      • 逻辑或中如果出现多个表达式,那么则从左往右依次判断,当遇到第一个为真的条件时直接停止,后面的表达式不会被判断。

 

4、位运算符

运算符

名称

举例

功能说明

~

位逻辑反

~a

将变量 a 中的每一位取反

&

位逻辑与

a & b

将变量 a 和 b 逐位进行与操作

|

位逻辑或

a | b

将变量 a 和 b 逐位进行或操作

^

位逻辑异或

a ^ b

将变量 a 和 b 逐位进行异或操作

左移

a

将变量 a 中的每一位向左移动4位

>>

右移

a >> 4

将变量 a 中的每一位向右移动4位

|右移| x >> n |将变量 x 中的每一位向右移动n位

  • 位运算符操作的对象是数据中的每一位
  • 运算规则:
    • 位逻辑反(单目): 把变量中的每一个位进行取反(int 则取反 32个位, char 则取反8个位...)
    • 位逻辑与(双目): 有0得0 (清零操作),全1得1 , a&b 则是把a和b的所有二进制位进行相应位与操作
    • 位逻辑或(双目) : 有1得1 (置1操作),全0得0, a|b 则是把a和b的所有二进制位进行相应位或操作
    • 异或运算:相同为0,不同为1
    • 移位运算:移出去的不要,空出来的补零。移位运算都是针对无符号数的运算。

 

 5、 特殊运算符

  • 赋值运算符 =
    • 不能对常量赋值 8 = a , 也不能对表达式进行复制 a+b = 13 ,只能对变量赋值 a = 8
    • 不能对数组赋值
    • 可以连续赋值,顺序从右到左
int a, b;
int x[5];

a = 100; // 对变量 a 赋值,正确
3 = 100; // 对常量 3 赋值,错误!
x = 123; // 对数组 b 赋值,错误!

// 连续赋值
a = b = 50; // 先将 50 赋给 b,再将 b 的值赋给 a,正确
a = b+1 = 50; // [错误] b+1 是一个表达式,不允许直接赋值
  • 复合赋值符
    • 当左右两边有相同的操作数时,采用复合赋值符不仅直观,且能提高运算效率
    • 除了下述10个复合运算符之外,生造别的复合运算符是非法的
// 加减乘除:
a += n; // 等价于 a = a+n;
a -= n; // 等价于 a = a-n【正确】;   a = n -a  [错误]
a *= n; // 等价于 a = a*n;
a /= n; // 等价于 a = a/n;

// 求余:
a %= n; // 等价于 a = a%n;

// 位运算:
a &= n; // 等价于 a = a&n;
a |= n; // 等价于 a = a|n;
a ^= n; // 等价于 a = a^n;
a >>= n; // 等价于 a = a>>n;
a <<= n; // 等价于 a = a<<n;

6、条件运算符(三目运算符)

  • 唯一需要三个操作数的运算符
  • 语法:表达式1 ? 表达式2 : 表达式3
  • 释义:当表达式1为真时取表达式2,否则取表达式3
  • 举例:
int a = 100;
int b = 200;
int m = (a>b) ? a : b;  // 如果 a>b 为真,则 m 取 a 的值,否则取 b 的值

7、sizeof 运算符

  • 含义:计算指定数据类型或者变量所占据内存的字节数
  • 语法:sizeof(类型) 、sizeof(变量) ,计算变量的字节数时圆括号可以省略
  • 举例:
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long double));

int a[5];
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);

8、return运算符

  • 含义:退出某个函数(如果退出的是主函数main,那么整个程序也就退出了)
  • 语法:必须出现在函数体内,可以带函数对应类型的数据
  • 举例:
int main()
{
    return 0;
}

9、优先级与结合性

  • 当表达式中出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除,后加减
  • 当表达式中出现多个相同优先级的运算符时,根据结合性来决定谁先运行,比如从左到右
 man operator
 
 This manual page lists C operators and their precedence in evaluation.

       Operator                            Associativity
       () [] -> .                          left to right  
       ! ~ ++ --(前缀) + -(单目) (type) * & sizeof     right to left
       * / %                               left to right
       + -                                 left to right
       << >>                               left to right
       < <= > >=                           left to right
       == !=                               left to right
       &                                   left to right
       ^                                   left to right
       |                                   left to right
       &&                                  left to right
       ||                                  left to right
       ?:                                  right to left
       = += -= *= /= %= <<= >>= &= ^= |=   right to left
       ,                                   left to right

逗号表达式是一种在C语言中使用逗号运算符将多个表达式组合在一起的方式。它的语法形式为:

expression1, expression2, expression3, ..., expressionn
a++ , b++ , a + b 

        逗号表达式的求值从左到右进行每个表达式按顺序被求值,并且整个逗号表达式的值是最后一个表达式的值。

        逗号表达式的主要作用是在一个单一的语句中执行多个操作,并且将最后一个操作的结果作为整个表达式的结果。它可以用于多个地方,例如:

  1. for循环的循环控制部分中 for(xxx ; xxx ; a++ , b++ , c++),可以用逗号表达式同时改变多个变量的值;
  2. 在函数调用时,可以用逗号表达式将多个参数一起传递;
  3. 在赋值操作中,可以用逗号表达式组合多个赋值操作

        需要注意的是,逗号表达式没有明显的实际应用场景,常常被认为是一种编码风格上的技巧。在实际编程中,应谨慎使用逗号表达式,以免降低代码的可读性和可维护性。

课外小练习:

  • 假设有 int a=3 , b= 5 ; 请编写代码在不使用第三个变量的情况下交换a和b的值。
  • 假设有 short k = 0xff00 ; 请编写代码在不改变其他数据位的情况下
    • 把k的第3和第7位设置为1
    • 把k的第10和14位设置为0

未完待续

有疑问的小伙伴可以留言一起交流讨论!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值