c和指針: c被許多人所诟病的一個缺點就是它品種繁多的操作符。c的這個特點使它很難精通。另一方面,c的許多操作符具有其他語言的操作符無可抗衡的價值。
可以看出操作符是c很重要的一部分。
算數操作符
+ - * / %
加減乘除,如果你學過數字電路的話,那就會清楚的知道,計算機在是怎麼實作的。如果沒的話,也不影響你靈活的使用他們。
注意:%(取模)操作符,必須兩邊都要是整數。
移位操作符
>> <<
左移:左移一位,右邊補0;

右移:
分為 - 邏輯右移和- 算術右移,具體由編譯器決定
邏輯右移:右側丢棄,左側補0;
算術右移:右側丢棄,左側補符号位;
如果你學過51單片機的話,就很清楚左移,右移的好處,要實作流水燈 (*-*);
位操作符
& | ~
把指定位,置1
把指定位,清0
指派操作符
=
需要注意 指派時有可能發生 隐式轉換 ,比如,getchar 的傳回類型為int(因為EOF為int型)
單目操作符
! ++ -(負) & 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