操做符和表達式

操做符和表達式

算術操做符(經常使用)

    +    -    *    /    %數組

注意:函數

    • — * /都可以做用於整數和浮點數。
  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)

下標引用、函數調用和結構成員

符號 功能
[] 數組訪問
() 函數調用
. 結構體/類 訪問成員
-> 結構體/類 指針訪問成員
相關文章
相關標籤/搜索