操作符的妙用

操作符在C語言中的妙用

操作符在C語言有着極其重要的地位,比如我們常用的加減乘除以及取模運算等。但其實操作符遠遠不止這些,主要歸爲以下幾類:

算術操作符
移位操作符
位操作符 
賦值操作符 
單目操作符 
關係操作符 
邏輯操作符 
條件操作符 
逗號表達式
下標引用以及函數調用和結構成員等

其中主要的操作符優先級順序如下:
指針最優,單目運算優於雙目運算。如正負號
算術運算,後移位運算,最後運算。請特別注意:1 << 3 + 2 & 7等價於 (1 << (3 + 2))&7.
邏輯運算最後結合。(摘自百度百科)
下面對一些重要操作符作一整理:
1.算術操作符&關係操作符&賦值操作符&邏輯操作符
這兩類操作符我們接觸較多,且用法較爲簡單,對此不作詳解
1.1.複合賦值符
類似於 a+=1;表示a=a+1;前提必須是操作符左邊可以容納右邊,即操作符左邊必須爲變量
類似的表達還有-=,*=,/=,%=,>>=,<<=,&=,|=,^=
注意:在賦值時儘量不要連續賦值。
1.2.關係操作符
主要有>,<,>=,<=, !=,==,這類操作符主要起判斷作用,返回值爲1或0.
1.3.邏輯操作符
&&邏輯與;||邏輯或
下面是360一段面試代碼

#include <stdio.h>
int main()
{
	int i = 0,a=0,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;
}

&&若出現0,後面均不執行;故程序返回1,2,3,4
||若出現真值(即不爲0),後面均不執行;故程序返回1,3,3,4
2.移位操作符
<< 左移操作符 >>右移操作符
左移操作符規則:左邊拋棄、右邊補0
左移操作符相當與乘法。
左移一位相當與x*(2^1);
左移兩位相當與x*(2^2),以此類推。
位運算在計算時最快,快於加減乘除
左移操作符規則:
1.邏輯移位 左邊用0填充,右邊丟棄
2.算術移位 左邊用原該值的符號位填充,右邊丟棄
右移操作符相當與除法(右移一位相當與x/(2^1),與左移類似)
注意:對於移位運算符,不要移動負數位,這個是標準未定義的。
3.位操作符的妙用
位操作符在日常代碼中很少接觸,但是它們有着極其重要的作用,常常可以提高程序速度,使問題得以簡化。
按位與:&
口訣:見0取0
按位或:|
口訣:見1取1
按位異或:^
口訣:同取0,不同取1
:它們的操作數必須是整數。

下面來看幾道面試題:
例1:
不能創建臨時變量(第三個變量),實現兩個數的交換

這種題常見的解法是利用c=a+b; a=c-a; b=c-b;來解決,但是利用位操作就讓其變得十分簡單。具體代碼如下:

#include<stdio.h> 
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);
	return 0;
}

例2:
求出兩個數int(32位)的二進制表達中,有多少個位(bit)不同
輸入例子:
1999 2299
輸出例子:7

解:創建函數用按位異或判斷它們之間的不同位(不同爲1),輸出一個數字len後,再利用按位與求出len中1的個數即可,具體代碼如下

#include<stdio.h>
int count_one_bits(unsigned int value)
{
	int count = 0;
	while (value != 0)
 	{
		count++;
		value = value&(value - 1);
	}
 	return count;
}

int diffent_bit(int m,int n)
{
	int len = 0;
	len=m^n;
	return count_one_bits(len);
}

int main()
{
	 printf("%d\n",diffent_bit(1999,2299));
	 return 0;
}

例3
一個數組中只有一個數字出現了一次。
其他所有數字都是成對出現的。
請找出這個數字。

解:採用&操作即可

#include<stdio.h>  
int main()
{
	int arr[11] = { 0, 1, 2, 3, 4, 9, 4, 3, 2, 1, 0 };
	int i=0;
	int len = sizeof (arr) / sizeof(arr[0]);
	for (i = 1; i < len; i++)
	{
		arr[0] = arr[0] ^ arr[i];
	}
	printf("單獨的數字爲:%d\n", arr[0]);
 	return 0;
}

4.單目操作符&三目操作符(條件操作符)
4.1.主要的單目操作符有
! 邏輯反操作
sizeof 操作數的類型長度(以字節爲單位)
sizeof可以求變量(類型)所佔空間的大小
注意:所有類型的指針均爲4個字節4個字節4個字節
& 取地址
~ 對一個數的二進制按位取反 前置
++,–
4.2.三目操作符
exp1 ? exp2 : exp3
主要起到選擇作用
將以下代碼改爲三目操作符爲

if (a > 5)
	b = 3;
else
	b = -3;
a > 5 ? b = 3 : b = -3

5.逗號表達式
主要形式爲:
exp1, exp2, exp3, …expN
從左向右依次執行。整個表達式的結果是最後一個表達式的結果。
有如下代碼:

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	printf("%d\n", c);
	return 0;
}

故輸出c的值爲13.

6.操作符的屬性

  1. 操作符的優先級
  2. 操作符的結合性
  3. 是否控制求值順序
    有如下代碼:
int main()
{
	int i = 10;
	i =i-- - --i * ( i= -3 ) * i++ + ++i; 
	printf("i = %d\n", i);
	return 0;
}

這樣的代碼無任何意義。
操作符的優先級只能決定自減–的運算在+的運算的前面,但是我們並沒有辦法得知,+操作符的左操作數的獲取在右操作數之前還是之後求值,所以結果是不可預測的,是有歧義的。

操作符在C語言有着極其重要的地位,用好操作符,寫出的代碼往往會有讓人意想不到,讓別人眼前一亮的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章