天天看點

c語言讓人又愛又恨操作符

c和指針: c被許多人所诟病的一個缺點就是它品種繁多的操作符。c的這個特點使它很難精通。另一方面,c的許多操作符具有其他語言的操作符無可抗衡的價值。

可以看出操作符是c很重要的一部分。

算數操作符

+      -         *        /       %    
           

加減乘除,如果你學過數字電路的話,那就會清楚的知道,計算機在是怎麼實作的。如果沒的話,也不影響你靈活的使用他們。

注意:%(取模)操作符,必須兩邊都要是整數。

移位操作符

>>      <<     
           

左移:左移一位,右邊補0;

c語言讓人又愛又恨操作符

右移:

分為 - 邏輯右移和- 算術右移,具體由編譯器決定

邏輯右移:右側丢棄,左側補0;

算術右移:右側丢棄,左側補符号位;

如果你學過51單片機的話,就很清楚左移,右移的好處,要實作流水燈 (*-*);

位操作符

&            |           ~ 
           

把指定位,置1

把指定位,清0

指派操作符

=  
           

需要注意 指派時有可能發生 隐式轉換 ,比如,getchar 的傳回類型為int(因為EOF為int型)

c語言讓人又愛又恨操作符

單目操作符

!   ++      -(負)     &     sizeof
 ~     --       +(正)     *      (類型)
           

! 邏輯取反操作:就是!num;如果num是0,則 !num=1; 如果num不為0,不管它為任何數,取反!num=0;(包括負數)

++ 分為 a++:(前置)++a(後置)

– -- 也和++樣 a-- ;–a

int a = 10;
int b = 8;
//int c = ++a;//結果為11
int d = a++;//結果為10
int e = --b;
int f = b--;
           

++ 和 - -的使用要注意:

#include <stdio.h>
int main()
{
    //printf("%d",10++)//這是一個錯誤的例子,我們并不能給一個常量++
    int  a=10;
    // ++a = 10;//  ++a是對變量值的拷貝  也就是說++a的結果為常量,不能給常量指派
               //******如果你不能了解的話,可參考《c和指針》p73。和p79,左值和右值;
    system("pause");
    return 0;
}
           

- 和 +:正數和負數

sizeof::::我們重點讨論sizeof:::從那些方面可以看出他是操作符而不是函數那下面舉例介紹:

#include <stdio.h>
int main()
{
     int i = 10;
     printf("%d",sizeof i);//    第一點可省略 ()  括号
     printf("%d",sizeof(int))
     return 0;
}
           
#inlcude <stdio.h>
int main()
{
    int i = 10;
    int s = 11;
    sizeof(s = 2*i);
    printf("%d",s);//結果為11,可見sizeof()的表達式并不進行運算。
    return 0;
}
           

** ~** 前面已經介紹,按位取反

* 和 & 解引用操作符:與指針一起使用

int main()
{
    int a = 0;
    int *p = &a;
    *p = 10;//  将a改為10;
}
           

(類型): 強制類型轉換

int a = 5;
a = (float)a;//将a強制轉話為  5.0    
           

關系操作符

>      >=   <   <=     !=    ==
           

一定要注意到:::判斷是否相等是(==)雙等号,

邏輯操作符

&&                   ||
   與操作            或操作
           

隻有真假兩種結果,a && b ,如果a和b都為真,表達式為1,否則表達式為0;

aa||b,如果a和b都為假,表達式為0,否則表達式為1;

條件操作符

a>b?a:b

求a,b中的較大值

逗号操作符(控制求值順序)

表達式的值就是最後一個表達式的值

while(a=0,b=0,a<10)
{
    ;// 
}
           

下标引用操作符 arr[ 10];

. 和 ->操作符

#include <stdio.h>
struct stu
{
    char name[20];
    int   age;
};
int mian()
{
    struct stu s;
    struct stu* ps=&stu;//結構體指針
    s.age = 18;//結構成員通路
    ps->age=18;  

}
           

總結

通過對操作符的學習我們可以很友善的解決許多問題,比如你可以試試下面幾道題:(你也可以在我的GitHub部落格找到答案)
           
// 編寫一個函數把指定的值存到這個整數中指定的幾位;
//e:       原始值 |   存儲值   |   起始位   |     結束位   |    傳回值 |
//          0x0   |   0x1      |    4       |     4        |     0x10  |
//       0xffff   |   0x123    |    15      |     4        |    0x123f |
//       0xffff   |   0x123    |    13      |     9        |    0xc7ff |
//         
//1.設定一個make;将要設定的那幾位置0,其他值不變;比如:~001111000000000 &
//2.将要往進放的值的對應位調整好對齊。
//3.用make 将放入值的其餘位清零; 進行按位與& 0011110000000000
//4.将第三步得到的值,與第一步得到的原值,進行按位or或操作;
           

本題答案在Candp_119

繼續閱讀