从0学起的C语言笔记(三、运算符)

前言

用算术运算符将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式 运算对象包括常量、变量、函数等
例如: a*b/c-1.5 + ‘a’


提示:以下是本篇文章正文内容,

运算符的分类

双目运算符
——即参加运算的操作数有两个
例:+
a+b
单目运算符
——参加运算的操作数只有一个
例:+ +自增运算符,给变量值+1,- -自减运算符
int a=10;
a++;
三目运算符
即参加运算的操作数有 3 个
( ) ? ( ) : ( )

算数运算符

运算符程序符号
+
-
乘以*
除以/
取余%

其他:+=、-=、*=、 /= 、%=
10%3 表达式的结果为 1 复合运算符:
a += 3 相当于 a=a+3
a*=6+8 相当于 a=a*(6+8)

关系运算符

(>、<、= =、>=、<=、!= )
!=为不等于
一般用于判断条件是否满足或者循环语句

逻辑运算符

1、&& 逻辑与,两个条件都为真,则结果为真

if((a>b) && (a<c))
if(b<a<c)          //这种表达方式是错误的

2、|| 逻辑或
两个条件至少有一个为真,则结果为真

if((a>b) || (a<c))

3、! 逻辑非

if(!(a>b))
{
 
 }

位运算

1、&按位与
任何值与0得0,与1保持不变使某位清 0
0101 1011
&
1011 0100
--------------------
0001 0000
2、| 按位或
任何值或1得1,或0保持不变
0101 0011
|
1011 0100
--------------------
1111 0111
3、~ 按位取反
1变0,0变1
0101 1101
~
--------------------
1010 0010
4、^ 按位异或
相异得 1,相同得 0
1001 1100
^
0101 1010
---------------------
1100 0110
5、位移
>>右移, << 左移
注意
右移分:逻辑右移、算数右移

  1. 右移
    逻辑右移 高位补0,低位溢出
    算数右移 高位补符号位,低位溢出 (有符号数)
    -15
    1000 1111
    1111 0000
    1111 11 00 -4

    • 逻辑右移
      低位溢出、高位补0
      0101 1010 >>3
      0000 1011
    • 算数右移
      对有符号数来说,低位溢出、高位补符号位。
      1010 1101 >> 3
      1111 010 1
      0101 0011 >>3
      0000 1010

    总结 右移:
    1、逻辑右移 高位补0,低位溢出

    无论是有符号数还是无符号数都是高位补 0,低位溢出
    2、算数右移 高位补符号位,低位溢出 (有符号数)
    对无符号数来说,高位补 0,低位溢出
    对有符号数来说,高位补符号位,低位溢出
    在一个编译系统中到底是逻辑右移动,还是算数右移,取决于编译器

//判断右移是逻辑右移还是算数右移
#include <stdio.h>
int main( ) {
    printf("%d\n",-1>>3);
    return 0; 
}   //如果结果还是-1 证明是算数右移
  1. 左移<< 高位溢出,低位补 0
    5<<1

条件运算符号

( ) ? ( ) : ( )
A ? B : C ;
如果 ? 前边的表达式成立,整个表达式的值,是?和:之间的表达式的结果 否则是:之后的表达式的结果

#include <stdio.h>
int main( ) {
    int a;
    a=(3<5)?(8):(9);
    printf("a=%d\n",a);
    return 0;
}

逗号预算符

( ) , ( )

#include <stdio.h>
int main(int argc, char *argv[]) {
    int num;
    num=(5,6);
    printf("%d\n",num);
    return 0;
}

注意: 逗号运算符的结果是,后边表达式的结果
注意: 逗号运算符的优先级最低

运算符总结:

运算符不仅有优先级还有结合型
2+3+9+10 左结合性
a=b=c=d=100 右结合性
优先级高的先于优先级低的先运算。
3+4*7
优先级一样的按结合性来运算
左结合性 从左往右运算
右结合性 从右往左运算

优先级表

优先级别运算符运算形式结合方向名称或含义
1()
[]
.
->
(e)
a[e]
x.y
p->x
从左到右圆括号
数组下标
成员运算符
用指针访问成员的指向运算符
2- +
++ - -
!
~
(t)
*
&
sizeof
-e
++x 或 x++
!e
~e
(t)e
*p
&e
sizeof(e)
从右到左负号或正号
自增运算或自减运算
逻辑非
按位取反
类型转换
指针运算,由地址求内容
求某变量的地址
求某类型变量的长度
3* / %e1*e2从左到右乘,除,取余
4+ -e1+e2从左到右加 减
5<< >>e1<<e2从左到右左移右移
6< <= > >=e1 < e2从左到右关系运算符
7== !=e1 == e2从左到右等于,不等于
8&e1&e2从左到右按位于
9^e1 ^ e2从左到右按位异或
10|e1 | e2从左到右按位或
11&&e1 && e2从左到右逻辑与
12| |e1 | | e2从右到左逻辑或
13? :e1 ? e2 : e3从右到左条件运算符
14=
+= -= *=
/= %= >>=
<<= &= ^= |=
x = e

x + = e


从左到右赋值运算符

符合赋值运算符


15,e1, e2从左到右顺序求值运算

优先级例程

#include <stdio.h> 
int main()
{
    int i=3;
    int num;
    num=i++;
    printf("num=%d,i=%d\n",num,i);   //num=3 ,i=4
    return 0;
}

++i 先加 ,后用

#include <stdio.h> 
int main()
{
    int i=3;
    int num;
    num=++i;
    printf("num=%d,i=%d\n",num,i);//num=4,i=4
    return 0;
}

优先级举例

#include <stdio.h>
int main( ) {
    int i=3;
    int num;
    num = (i++)+(i++)+(i++);
    printf("num=%d\n",num);
    return 0; 
}
#include <stdio.h>
int main( ) {
    int i=3;
    int num;
    num = (++i)+(++i)+(++i);
    printf("num=%d\n",num);
    return 0;
}

结语

非常感谢您能看到这里,下一次是条件控制语句与循环控制语句

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值