開服上線不到一週?《弈劍行》被黑客組織勒索關服
+ 加(雙目)
-減(雙目)
*乘(雙目)
/除(雙目)5/3=1(舍掉了小數) 5.0/3.0=1.666667
%求餘(雙目)不能夠帶小數點
+正(單目)
-負(單目)
什麼是目?
1+2(1和2是運算元,有幾個運算元就是幾目)
表示式:用運算子和括號將運算元連線起來的式子
例如:
1+1
'a'+'b'
a+b
a+'b'+pow(a,b)*3/4+5
運算子的優先順序和結合性
注1:優先順序相同的運算子,運算次序由結合性決定。
- 比如 3 * 4 / 5 % 6,其中乘號、除號和求餘運算子在同一優先順序,結合性是“左到右”,因此先計算 3 * 4,再計算 / 5,最後計算 % 6
- 再如 -i++,符號和自增運算子在同一優先順序,結合性是“右到左”,因此 -i++ 相當於 -(i++)
注2:* 目運算子是指運算元的個數,比如單目運算子只有一個運算元,雙目運算子有兩個運算元,而三目運算子則有三個運算元。
注3:通過使用小括號可以提升表示式的優先順序至最高。
- 比如 (1 + 2) * (3 - 4),其中加號、減號運算子的優先順序本身是要低於乘號運算子的,但由於使用了小括號,且結合性均是“左到右”,所以先計算 (1 + 2),再計算 (3 - 4),最後才將前兩者的結果相乘
優先順序 | 運算子 | 含義 | 使用形式 | 結合性 | 說明 |
1 | [ ] | 陣列下標 | 陣列名[整型表示式] | 左到右 → | |
( ) | 圓括號 | (表示式) | |||
. | 成員選擇(物件) | 物件.成員名 | |||
-> | 成員選擇(指標) | 物件指標->成員名 | |||
++ | 自增運算子 | 變數名++ | 單目運算子 | ||
-- | 自減運算子 | 變數名-- | 單目運算子 | ||
2 | - | 負號運算子 | -表示式 | 右到左 ← | 單目運算子 |
(型別) | 強制型別轉換 | (資料型別)表示式 | 單目運算子 | ||
++ | 自增運算子 | ++變數名 | 單目運算子 | ||
-- | 自減運算子 | --變數名 | 單目運算子 | ||
* | 取值運算子 | *指標表示式 | 單目運算子 | ||
& | 取地址運算子 | &左值表示式 | 單目運算子 | ||
! | 邏輯非運算子 | !表示式 | 單目運算子 | ||
~ | 按位取反運算子 | ~表示式 | 單目運算子 | ||
sizeof | 長度運算子 | sizeof 表示式 或 sizeof(型別) | 單目運算子 | ||
3 | / | 除 | 表示式 / 表示式 | 左到右 → | 雙目運算子 |
* | 乘 | 表示式 * 表示式 | 雙目運算子 | ||
% | 餘數(取模) | 整型表示式 % 整型表示式 | 雙目運算子 | ||
4 | + | 加 | 表示式 + 表示式 | 左到右 → | 雙目運算子 |
- | 減 | 表示式 - 表示式 | 雙目運算子 | ||
5 | << | 左移 | 表示式 << 表示式 | 左到右 → | 雙目運算子 |
>> | 右移 | 表示式 >> 表示式 | 雙目運算子 | ||
6 | > | 大於 | 表示式 > 表示式 | 左到右 → | 雙目運算子 |
>= | 大於等於 | 表示式 >= 表示式 | 雙目運算子 | ||
< | 小於 | 表示式 < 表示式 | 雙目運算子 | ||
<= | 小於等於 | 表示式 <= 表示式 | 雙目運算子 | ||
7 | == | 等於 | 表示式 == 表示式 | 左到右 → | 雙目運算子 |
!= | 不等於 | 表示式 != 表示式 | 雙目運算子 | ||
8 | & | 按位與 | 整型表示式 & 整型表示式 | 左到右 → | 雙目運算子 |
9 | ^ | 按位異或 | 整型表示式 ^ 整型表示式 | 左到右 → | 雙目運算子 |
10 | | | 按位或 | 整型表示式 | 整型表示式 | 左到右 → | 雙目運算子 |
11 | && | 邏輯與 | 表示式 && 表示式 | 左到右 → | 雙目運算子 |
12 | || | 邏輯或 | 表示式 || 表示式 | 左到右 → | 雙目運算子 |
13 | ?: | 條件運算子 | 表示式1? 表示式2: 表示式3 | 右到左 ← | 三目運算子 |
14 | = | 賦值運算子 | 變數 = 表示式 |
右到左 ← |
雙目運算子 |
/= | 除後賦值 | 變數 /= 表示式 | 雙目運算子 | ||
*= | 乘後賦值 | 變數 *= 表示式 | 雙目運算子 | ||
%= | 取模後賦值 | 變數 %= 表示式 | 雙目運算子 | ||
+= | 加後賦值 | 變數 += 表示式 | 雙目運算子 | ||
-= | 減後賦值 | 變數 -= 表示式 | 雙目運算子 | ||
<<= | 左移後賦值 | 變數 <<= 表示式 | 雙目運算子 | ||
>>= | 右移後賦值 | 變數 >>= 表示式 | 雙目運算子 | ||
&= | 按位與後賦值 | 變數 &= 表示式 | 雙目運算子 | ||
^= | 按位異或後賦值 | 變數 ^= 表示式 | 雙目運算子 | ||
|= | 按位或後賦值 | 變數 |= 表示式 | 雙目運算子 | ||
15 | , | 逗號運算子 | 表示式1,表示式2,表示式3,… | 左到右 → |
數字越小,優先順序越高
#include <stdio.h>
#include<math.h>
int main()
{
int i,j, k;
i=1+2;
j=1+2*3;
k=i+j+-1+pow(2,3);
printf("i=%d\n",i);
printf("j=%d\n",j);
printf("k=%d\n",k);
return 0;
}
結果:
i=3
j=7
k=17
型別轉換
當整形與浮點型相加時,系統會自動將坑位較小的型別轉化為較大的型別(為保障資料準確),所以整形轉化為浮點型
例如:
1+2.0=1.0+2.0
#include <stdio.h>
int main()
{
printf("整形輸出:%d\n",1+2.0);
printf("浮點型輸出:%f\n",1+2.0);
return 0;
}
結果:
整形輸出:0
浮點型輸出:3.000000
第一個錯誤的原因:把浮點型強行變為整形輸出,應該將整形變為浮點型
c語言還允許你強制轉換運算元的資料型別
就是在運算元的前邊用小括號將目標資料型別括起來就行了
#include <stdio.h>
int main()
{
printf("整形輸出:%d\n",1+(int)2.0);
printf("浮點型輸出:%f\n",1+2.0);
return 0;
}
結果:
整形輸出:3
浮點型輸出:3.000000
如果2.0為1.8,相加時1.8會捨去1 結果為2
#include <stdio.h>
int main()
{
printf("整形輸出:%d\n",1+(int)(1+0.8));
printf("浮點型輸出:%f\n",1+2.0);
return 0;
}
因為括號優先順序最高,所以先1+0.8=1.8,1.8變為1,後與1相加,輸出結果為2