初学C语言———带你认识操作符

目录

算术操作符

移位操作符

<<(左移操作符)

>>(右移操作符)

位操作符

&(按位与)

|(按位或)

^(按位异或)

赋值操作符

单目操作符

~(按位取反)

--或++(前置、后置)

关系操作符

逻辑操作符

&&(逻辑与)

||   (逻辑或)

条件操作符

逗号表达式

下标引用、函数调用和结构成员

[ ]下标引用操作符

( ) 函数调用操作符

结构成员访问操作符


移位操作符位操作符均需了解补码的知识,不太懂的可看我这篇文章http://t.csdn.cn/hURbd

算术操作符

+   -   *   /    

除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

/    对于 / 操作符如两个操作数都为整数,执行整数除法(向下取整)。而只要有浮点数执行的就是浮点数除法。

% (取模) 操作符的两个操作数必须为整数。返回的是整除之后的余数。

移位操作符

<< 左移操作符
>> 右移操作符
这里的操作都是基于补码

<<(左移操作符)

        移位规则:左边抛弃、右边补0      

注意:此时num的值不发生改变,num<<1的十进制值为20

我们将二进制转换为十进制会发现一个规律:

原         :1010  =1*2^3+1*2^1

左移1位:10100=1*2^4+1*2^2=(1*2^3+1*2^1)*2

可得:左移n位的十进制数就是在原数上乘2的n次方(移动位数不能太大要注意是否溢出)

>>(右移操作符)

        移位规则:

        首先右移运算分两种:
        1. 逻辑移位 左边用0填充,右边丢弃(一般用于无符号整数)
        2. 算术移位 左边用原该值的符号位填充,右边丢弃(一般用于有符号整数)
        注意:对于移位运算符,不要移动负数位(如:num>>-1),这个是标准未定义的。

注意:此时num的值依然不发生改变

由左移的推论同理可得:右移n位的十进制数就是在原数上除2的n次方向下取整

位操作符

& //按位与

|   // 按位或
^  // 按位异或
注:他们的操作数必须是整数,这里的操作同样是基于补码

&(按位与)

        运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。

例:3&9

       3的二进制:0011

       9的二进制:1001

       3&9的结果:0001

       即3&9 = 1

|(按位或)

        运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。

例:3&9

       3的二进制:0011

       9的二进制:1001

       3&9的结果:1011

       即3&9 = 11

^(按位异或)

        运算规则:参加运算的两个数,对应二进制位相同为0,相异为1。

例:3&9

       3的二进制:0011

       9的二进制:1001

       3&9的结果:1010

       即3&9 = 10

特点:

1、n^0都等于n

        如:3^0

                3的二进制:0011

                0的二进制:0000

                3^0的结果:0011

                即3^0 = 3

2、n^n等于0

        如:3^3

                3的二进制:0011

                3^3的结果:0000

                即3^3 = 0

3、^满足交换律

        如:3^9^3 = 3^3^9 = 0^9 = 9

赋值操作符

=        +=         -=         *=         /=         %=         >>=         <<=         &=         |=         ^=
对变量进行赋值操作,没啥好讲的
例:a = a + 10和a += 10相同

单目操作符

单目操作符是 只接受一个操作数的操作符
!                    逻辑反操作
-                    负值
+                   正值
&                   取地址
sizeof          操作数的类型长度(以字节为单位)注:这不是函数
~                   对一个数的二进制按位取反
--                   前置、后置 --
++                 前置、后置 ++
*                    间接访问操作符 ( 解引用操作符 )
(类型)             强制类型转换

~(按位取反)

        运算规则:对数的二进制每一位按位取反

例:~9

       9的二进制补码:0(符号位)1001

       ~9的结果         :1(符号位)0110

       即~9  =  -10

对于所有整数取反=其本身的相反数-1

--或++(前置、后置)

前置先对操作数进行自减(即-1)或自增(即+1),然后使用操作数

例:

int a = 10

int x = ++a;

a = 11        x = 11

先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。
后置:先使用操作数,然后对操作数进行自减(即-1)或自增(即+1)
例:
int a = 10;
int x = a++;
a = 11        x = 10
先对a先使用,再自增,这样x的值是10;之后a变成11

关系操作符

>
>=
<
<=
!=            用于测试“ 不相等
==           用于测试“ 相等
比较简单,就不过多赘述了

逻辑操作符

&&        逻辑与
||           逻辑或

&&(逻辑与)

        运算规则:若操作符两侧的条件均为真即为真(返回1),任意条件为假即为假(返回0)

注意:&&左边若为假,右边就不计算了

例: int i = 0,a=0,b=2,c =3,d=4;

        i = a++ && ++b && d++;

        此时a = 1, b = 2, c = 3, d = 4

||   (逻辑或)

        运算规则:若操作符两侧的任意条件真即为真(返回1),条件均为为假即为假(返回0)

注意:||左边若为真,右边就不计算了

例:int i = 0,a=0,b=2,c =3,d=4;

        i = a++||++b||d++;

        此时a = 1, b = 3, c = 3, d = 4

条件操作符

exp1 ? exp2 : exp3

条件操作符也叫三目操作符

 例:

if (a > 5)
        b = 3;
else
        b = -3;
//以上代码可改写为
(a > 5) ? (b = 3) : (b = -3);
//或者写为
b = (a > 5) ? 3 : -3;

逗号表达式

exp1, exp2, exp3, …expN

        运算规则:从左向右依次执行,整个表达式的结果是最后一个表达式的结果

举个例子让大家更好理解

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式

从左往右依次计算,a>b为假,a = b + 10 = 12, a = 12, b = a + 1 = 13

可得c = 13

下标引用、函数调用和结构成员

[ ]下标引用操作符

操作数:一个数组名 + 一个索引值
例:
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。

( ) 函数调用操作符

操作数:接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数
的参数。
例:
#include <stdio.h>
int add (int x, int y)
{
    return x + y;
}
int main()
{
    int a = 1, b = 2;
    add(a,b);//这里的()就是函数调用操作符,操作数为 add , a , b 这三个
    return 0;
}

结构成员访问操作符

.             结构体 . 成员名
->           结构体指针 -> 成员名
例:
#include <stdio.h>
struct Stu
{
    char name[10];
    int age;
    char sex[5];
    double score;
};
void print_age1(struct Stu stu)
{
    printf("%d",stu.age)// . 结构成员访问(用于结构体)
}
void print_age2(struct Stu* pStu)
{
    printf("%d",pStu->age)// -> 结构成员访问(用于结构体指针)
}
int main()
{
    struct Stu stu = 20;
    struct Stu* pStu = &stu;
    print_age1(stu);
    print_age2(pStu);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值