操做符和表达式

操做符和表达式

算术操做符(经常使用)

    +    -    *    /    %数组

注意:函数

    • — * /都可以做用于整数和浮点数。
  1. 对于/操做符若是两个操做数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  2. %操做符的两个操做数必须为整数。返回的是整除以后的余数。

移位操做符

左移运算符(<<)

规则:
  按二进制形式把全部的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。3d

例: 3 << 2
计算过程:
-w600指针

数学意义:
        在数字没有溢出的前提下,对于正数和负数,左移一位都至关于乘以2的1次方,左移n位就至关于乘以2的n次方。code

右移运算符(>>)

规则:
        按二进制形式把全部的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。blog

例1:11 >> 2
计算过程:
-w600数学

例2:-7 >> 2
计算过程:
-w520io

数学意义:
右移一位至关于除2,右移n位至关于除以2的n次方。table

注意:移位操做符不能移动负数位class

位操做符

& :按位与(相同位置只有都为1才为1)
| :按位或(相同位置要有一个位为1就为1)
^ :按位异或(相同位置相同为0,不一样则为1)
注意:他们的操做数都必须是整数,按位故而须要按照整数的二进制每位操做,

应用

1.求一个整数二进制中1的个数?

//方法一
int CountOfNum1(int num)
{
    int count = 0;
    while (num > 0)
    {
        if (num % 2 == 1)
            count++;
        num = num / 2;
    }
    return count;
}
//方法二
int CountOfNum2(int num)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; ++i)
    {
       //把每一位右移到最右边和1按位与,统计1出现的次数
        if (((num >> i)&1) == 1)
        {
            count++;
        }
    }
    return count;
}
//方法三(最优)
int CountOfNum3(int num)
{
    int count = 0;
    while (num)
    {
        count++;
        num = num&(num - 1);
    }
    return count;
}

2.不能建立临时变量(第三个变量),实现两个数的交换

int main()
{
    int a = 10;
    int b = 20;
    //利用异或性质中间导了一遍
    a = a^b;
    b = a^b;
    a = a^b;
    printf("a = %d  b = %d\n", a, b);
    system("pause");
    return 0;
}

赋值操做符

简单赋值

赋值操做符比较简单,就是给变量赋值,比较常见的就是咱们在对一个已经被赋值的变量进行修改,直接将这个变量直接赋值成你想要的
例如:

int a = 0;
a = 10;

复合赋值

+=         -=         /=         *=         %=         >>=         <<=         &=         |=    等等

单目操做符

操做符 名称
逻辑反操做符
- 负号
+ 正号
& 取地址
-- 自减
++ 自增
~ 按位取反
* 解引用、间接访问
sizeof 类型长度
(类型) 强制类型转换

注意:结合使用时必定要搞清楚优先级,若是不清楚,手动加上括号来控制

关系操做符

符号 名称
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于等于
!= 不等于
int main()
{
    int a = 3;
    printf("%d", a += a-= a * a);
    return 0;
}

输出结果
-12
作题思路:
因为每次都须要将后面的值算出来才能进行-=和+=,故此题是按照从右向左计算的,为了方便理解,咱们能够拆分计算
a += (a -= a*a)    a -= (a*a)     b = a*a=9
a -= (a*a)--> a -= b---> a = -6(注意此时a的值已是6了,后面运算时a的值都以6计算)
a += (a -= a*a)---> a += a ---> -6+(-6)=-12

逻辑操做符

&& 逻辑与(“而且”):两个操做数都为真,结果才为真
||    逻辑或(“或者”):全部操做数都为假时才为假,有一个或者多个操做数为真就为真

注意:区分逻辑与/或 和 按位与/或的区别

#include <stdio.h>
int main() {
       int i = 0,a=1,b=2,c =3,d=4;
       i = a++&&++b&&d++;
       //i = a++||++b||d++;
       printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
       return 0;
}

输出结果
    2,3,3,5
//  2,2,3,4

条件操做符

A ? B : C --- 三元运算符
在某些场景下能够替代if else语句

if(y > 0)
    x = 1;
else
    x = 0;

以上代码等同于下段代码

( y > 0) ? x = 1 : x = 0;

逗号表达式

将两个及以上的式子链接起来,整个表达式的值是最后一个表达式的值

  1. 从左到右依次计算
  2. 最终值是表达式中最后一个表达式的值
  3. 全部运算符中优先级最低的

例:

int main()
{
    int i = 1;
    int j = 1;
    int z = 0;
    z = i++,j++,++j;
    //z = (i++,j++,++j);
    printf("i=%d j=%d z=%d",i,j,z);
    return 0;
}

输出结果
    2,3,1
//  2,3,3
解题思路:
z = i++,j++,++j;由于=的优先级要高于逗号表达式,因此原式等于(z = i++),j++,++j;
由于后置加加先使用后加加,因此z=1,i=2,j++时j为1,当走到j++后面的,时j已经变成2,++j后就成了3。

同理 z = (i++,j++,++j);()的优先级高于=,因此先算()里的逗号表达式,再算=,因此z=3。

某些场景逗号表达式也可使表达简洁

//while(a > 0)
    //{
    //    a = test();
    //    a++;
    //}
    //等价上面代码
    while(a = test(), a++, a > 0)

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

符号 功能
[] 数组访问
() 函数调用
. 结构体/类 访问成员
-> 结构体/类 指针访问成员
相关文章
相关标签/搜索