邏輯運算符使用分析
&&和||
1、程式中的短路
短路規則
||從左向右開始計算當遇到為真的條件時停止計算整個表達式為真所有條件為假時表達式才為假。
&&從左向右開始計算當遇到為假的條件時停止計算整個表達式為假所有條件為真時表達式才為真
2、三目運算法
a<b?a:b
傳回的是變量的值而不是變量c++在這裡進行了改進傳回的是這個的引用。
*(a<b?&a:&b)改進方式
五位運算
c語言号稱進階語言為什麼支援位運算
在嵌入式開發中會經常與外部連結序列槽和并口很需要位運算的
1、按位與2&3010&011=010
2、按位或2|3010|011=011
3、按位異或2^3010^011=011
有結合律和交換律
4、左移和右移注意點
左移運算符<<将運算數的二進制位左移
規則高位丢棄低位補0
5、右移運算符>>把運算數的二進制位右移
規則高位補符号位地位丢棄
6、防錯準則
避免位運算符邏輯運算符和數學運算符同時出現在一個表達式中
當位運算符邏輯運算符和數學運算符需要同時參與運算時盡量使用括号()來表達計算次
序
位移的大小不能大于輸的長度且不能為負的
7、tips
左移n位相當于乘以2的n次方但效率比數學運算符高
右移n位相當于除以2的n次方但效率比數學運算符高
8、交換變量的三種方式
#defineswap1(a,b)\
{\
inttemp=a;\
a=b;\
b=temp;\
}
#defineswap2(a,b)\
a=a+b;\
b=a-b;\
a=a-b;\
}//比第一種少用了一個變量,當a和b很大的時候會溢出
#defineswap3(a,b)\
a=a^b;\
b=a^b;\
}//效率最高但隻适合×××(a^a)^b=b
試題有一個數列其中的自然數都是以偶數的形式出現隻有一個自然數出現的次數為奇數次。編寫程式找出這個自然數。
方法一将數列排序排序後去讀取一旦奇數個就跳出
方法二用空間換時間先找到最大的數n然後申請n個空間,把數組清零
然後用循環for(...)b[a[i]]++;最後周遊數組的大小一但是奇數就傳回。
方法三用按位異或不斷的消除最後隻剩下一個就是要的答案
#include<stdio.h>
intmain()
{
inta={1,1,1,2,3,4,5,6,5,6,4,3,2};
inti=0;
intfind=0;
for(i=0;i<(sizeof(a)/sizeof(int)),i++)
find=find^a[i];
printf(“%d\n”,find;
return0;