动态

详情 返回 返回

c语言中的操作符 - 动态 详情

記得點擊查看

點擊查看代碼
1.算數操作符
{
     a.+ 加號
     b.- 減號
     c.* 乘號
     d./ 除號   {  計算兩數相除的商,當 / 的兩邊都為整形時,計算結果默認為 int 。當  /  兩邊任意一邊出現小數,計算結果為float or double}
     e.% 取模   {  %  計算的時兩數相除後的餘數,其兩邊必須為 int ,整除時結果為 0 }
}

2.移位操作符(只能對於 int 使用,無符號整型這裏算作正數//移位操作符移動的位數不能為負數,標準未定義這種寫法,所以在不同編譯器中有不同結果)
{
     a.<< 左移    {  對整數的補碼左移一位,左邊丟棄,右邊補零  }
     b.>> 右移    {  對整數的補碼右移一位  算數移位:右邊丟棄,左邊補原符號位       //算數移位和邏輯移位取決於編譯器,大部分是算數移位
                                       邏輯移位:右邊丟棄,左邊補零
                  }
//整數的二進制表達有三種
(原碼,反碼,補碼)
//對於正整數的三種表達相同,而負整數有不同的表達
//例:
【
     7
     00000000 00000000 00000000 00000111——32位原碼
     00000000 00000000 00000000 00000111——32位反碼            // 由於 int 類型佔據 4 個字節,所以其在內存中以32 bit的 2 進制存儲,第一位為字符位,為 1 表示負數,0 為正數 ;
     00000000 00000000 00000000 00000111——32位補碼
     -7
     10000000 00000000 00000000 00000111——32位原碼
     11111111 11111111 11111111 11111000——32位反碼            //反碼就是將除字符位以外的bit位由 1 變為 0 ,由 0 變為 1 ;
     11111111 11111111 11111111 11111001——32位補碼            //補碼就是在反碼的基礎上 + 1 ;


      int a = 7;
      int b = 0;
      b = a << 1;   //此時輸出 b 的結果為 14 —————— 00000000 00000000 00000000 00001110
      
      int c = -7;
      b = c << 1;   //此時輸出 b 的結果為 -14 ————— 11111111 11111111 11111111 11110010補碼  —— 11111111 11111111 11111111 11110001反碼 —— 10000000 00000000 00000000 00001110原碼
 】
}

3.位操作符(計算時兩邊的操作數要為 int)
{
     a.& 按位與       //與:對於兩個二進制數,&的兩邊都為1,與的結果為1,兩邊只要有0,結果為0
     b.| 按位或       //或:對於兩個二進制數,|的兩邊都為0,或的結果為0,兩邊只要有1,結果為1              
     c.^ 按位異或     //異或:對於兩個二進制數,相同結果為0,相異結果為1
	 
按位的含義就是按補碼的二進制位,每位單獨進行比較
//例1:
       int a = 8;        //00000000 00000000 00000000 00001000  8的補碼
       int b = -4;       //11111111 11111111 11111111 11111100  -4的補碼
       a & b =           //00000000 00000000 00000000 00001000  結果的補碼,由於是正數,所以原碼也是這個,結果為8
       a | b =           //11111111 11111111 11111111 11111100  結果的補碼 —— 11111111 11111111 11111111 11111011反碼—— 10000000 00000000 00000000 00000100原碼,結果為-4
       a ^ b =           //11111111 11111111 11111111 11110100  補碼 —— 11111111 11111111 11111111 11110011反碼 —— 10000000 00000000 00000000 00001100原碼,結果為-12

//例2:
       
       int main()
       {
           int a = 10;
           int b = 20;
           a = a ^ b;//10^20
           b = a ^ b;//10^20^20               //不建立新變量,交換兩個數值,只適用於int
           a = a ^ b;//10^20^10 (20^20=0)
       }
 }

4.賦值操作符
{
  a.= 賦值
  賦值操作符可以連續使用
例:
   int a = 10;
   int b = 20;
   int c = 30;
   a = b = c + 10;//輸出的結果為a=40,b=40
   
   
   b.複合賦值操作符
   +=
   -=
   *=
   /=
   %=
   ^=
   &=
   |=
   <<=
   >>=
例:
   int a = 0;
   a = a + 1;
   a +=1;     //這兩種寫法結果是相同的,其他的複合賦值操作符同理
}

5.單目操作符(只有一個操作數)
{
   !  邏輯反操作//把真轉為假,把假轉為真,C語言中一般把0視為假,非零視為真
   -   負號
   +   正號
   &   取地址(字面意思,取出一個變量的首地址)
   sizeof(操作數)   計算操作數的字節長度(所佔內存大小,類型,變量,數組等)//sizeof後的括號在某些情況下是可以省略的
   ~   對操作數按位取反
   {
     int a = 10; //00000000 00000000 00000000 00001010 補碼
	 a = ~a;     //11111111 11111111 11111111 11110101 結果的補碼——11111111 11111111 11111111 11110100反碼——10000000 00000000 00000000 00001011原碼,結果為-11
	 a |=(1<<5);
	 a &=(~(1<<5))//這兩個公式算出來的結果相同,這也是這些符號的一些用法,目的是對與a中存儲的32位比特的任意一位進行修改
   }
   ++ 自增   前置++:先++再使用  後置++:先使用後++  //++可以看作a = a + 1
   -- 自減   前置--:先--再使用  後置--:先使用後--  //--可以看作a = a - **1
   //對操作數加一或減一,**對於使用操作數的場景,其放在操作數前後產生效果不同**
   * 間接訪問操作符(解引用操作符)
   {
      int a =10;
	  int* p = &a;
	  *p = 20;//此時a中的值變為二十,*的作用就是通過p中存放的地址找到a變量,所以*p就等於a
   }
   (類型) 強制類型轉換
   {
      int a = (int)58.5148951;//a現在等於58,相當於把浮點型強制轉換成了整數,後面的小數位丟失了
   }
}

6.關係操作符  (不是所有內容都可以用關係操作符比較)
{
   >    大於
   <    小於
   >=   大於等於
   <=   小於等於
   !=   不等於
   ==   等於    (一定要注意不要把==寫成=,一個是等於,一個是賦值)
}

7.邏輯操作符//只對真假進行判斷,結果也只有0或1
{
&&  邏輯與(全真為真,一假則假)//當其左邊為假,直接出結果,右邊整個過程不進行計算
	{
	   int a = 4;
	   int b = 3;
	   int c = 0;
	   int d = a && b//此時d的值為 1
	   int e = b && c//此時e的值為 0
	}
||  邏輯或(一真則真,全假為假)//當其左邊為真,直接出結果,右邊整個過程不進行計算
	{
	   int a = 4;
	   int b = 3;
	   int c = 0;
	   int d = a || b;//  1
	   int e = b || c;//  1
	   d = 0;
	   e = d || c;//   0
	}
}

8.條件操作符//三目操作符(從左向右依次計算)
{
    表達式1 ? 表達式2 :表達式3
	//表達式1如果為真,則計算表達式2,表達式2的結果為整個表達式的結果,表達式3不進行計算
	//表達式1如果為假,則計算表達式3,表達式3的結果為整個表達式的結果,表達式2不進行計算
}

9.逗號表達式
{
   表達式1,表達式2,表達式3,表達式4,.....,表達式n
   //逗號表達式就是用逗號隔開的多個表達式,從左到右依次執行,表達式的結果就是最後一個表達式的結果
   例子
   {
      while(a = get_val(), count_val(a),a > 0 )
	  {
	    ;
	  }
	  //等價於
	  do
	  {
	     a=get_val();
	     count_val(a);
	  }while(a>0)
   }
}

10.
{
a.下標引用操作符
	     []
	 {
	     int arr[10] = { 0 };
		 arr[9]=10;//使用下標引用,兩個操作數分別為數組名和下標數9
		 9[arr]=10;//兩者可以交換arr[9] ---> *(arr + 9) ---> *(9 + arr) --->9[arr]
	 }
b.函數調用操作符
	      ()
	{
	   //函數定義
	   int ADD(int a, int b)
	   {
	       return a + b;
	   }
	   int main()
	   {
	       int a = 10;
		   int b = 20;
		   //函數調用
		   int c = ADD(a,b);//()就是函數調用操作符,操作數為函數名和參數,至少有一個操作數(函數名)
		   return 0;
	   }
	}
c.訪問結構體成員
	    ->  結構體指針變量 -> 成員名
	    .   結構體名 . 成員名
		{
		    #include<stdio.h>
		    #include<string.h>
		    struct a
			{
			   char name[20];
			   int age;
			   double score;
			}
			void set_a(struct a* s)
			{
			   strcpy((*s).name,"zhangsan");
			   (*s).age = 18;
			   (*s).score = 100.00;
			   //or strcpy(s->name,"zhangsan");
			   //   s->age = 18;
			   //   s->score = 100.00
			}
			void print_a(struct a s)
			{
			   printf("%s %d %lf",s.name,s.age,s.score);
			}
		    int main()
			{
			  struct a s = { 0 };
			  set_a (&s);
			  print_a(s);
			  return 0;
			}
		}
}


總結:操作符的計算順序呢,是由優先級和結合性來共同決定的

Add a new 评论

Some HTML is okay.