0 運算符優(yōu)先級
1 算術(shù)運算符:
- 2級運算符:++ 、--
- 3級運算符:* 屈芜、 / 郊愧、 %
- 4級運算符:+ 、-
2 關(guān)系運算符
- 6級運算符:> 井佑、>= 属铁、< 、<=
- 7級運算符:== 躬翁、!=
3 邏輯運算符
- 2級運算符:!
- 11級運算符:&&
- 12級運算符:||
參見:位操作
4 位運算符
- 2級運算符:~
- 5級運算符:>> 焦蘑、<<
- 8級運算符:&
- 9級運算符:^
- 10級運算符:|
參見:位操作
5 特殊運算符
5.1 賦值運算符
x=y的含義是:將變量y的內(nèi)容賦給變量x的地址所對應(yīng)的那塊內(nèi)存。
注意:
賦值運算符的左值必須可寫
不能對常量賦值:100=i;
不能對只讀變量賦值:const int i; i=200;
不能對數(shù)組整體賦值:int a[3]; a={1, 2, 3};
賦值表達(dá)式:
將賦值表達(dá)式作為條件會警告盒发,其值非零:
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if(a=1)
#include<stdio.h>
int main(void)
{
int a;
if(a=1)
{
printf("a = %d\n", a);
}
return 0;
}
//輸出:
a = 1
連續(xù)賦值:
賦值順序從右至左
#include<stdio.h>
int main(void)
{
int a;
char b;
a = b = 128;
printf("a = %d\n", a); //-128
printf("b = %d\n", b); //-128
printf("------------------\n");
b = a = 128;
printf("a = %d\n", a); //128
printf("b = %d\n", b); //-128
return 0;
}
//輸出
a = -128
b = -128
------------------
a = 128
b = -128
5.2 復(fù)合賦值運算符
復(fù)合算術(shù)運算符:(5個)
- +=
- -=
- *=
- /=
- %=
復(fù)合位運算符:(5個)
- >>=
- <<=
- &=
- |=
- ^=
注意:
- 沒有 "~="復(fù)合運算符
- a *= b+c 等價于 a = a(b+c)
5.3 條件運算符(三目運算符)
計算最大值:
x = (a>b) ? a : b;
注意:
條件運算符可以單獨作為一條語句例嘱,如:(a>b) ? a : b;
為非法,但是以下代碼合法:
int a = 2,b = 4;
(a>b) ? puts("a") : puts("b");
5.4 sizeof運算符
計算類型或者變量所占的字節(jié)數(shù)狡逢。
操作數(shù)可以是類型,也可以是變量拼卵。類型一定要加括號甚侣,而變量則可以省略。
計算字符串時间学,包括結(jié)束標(biāo)記 '\0'
5.5 逗號運算符
參見:逗號運算符
6 復(fù)合情況
實例1:
一般代碼中不要這么寫,gcc編譯器開啟-Wall會有告警:
warning: operation on ‘a(chǎn)’ may be undefined [-Wsequence-point]
a += (a++);
這種一般只出現(xiàn)在面試題中印荔,記錄一下:
#include<stdio.h>
int main(void)
{
int a=1, b=1;
a += (a++); //等價于 a = a + (a++)=
printf("a = %d\n", a);
b += (++b); //等價于 b = b + (++b)
printf("b = %d\n", b);
return 0;
}
//輸出
a = 3
b = 4
實例2:
在gcc中這兩個表達(dá)式均不能通過編譯低葫,a++或++a均不能作為左值。
(a++) += a;
(++a) += (a++);
參考博客:https://blog.csdn.net/mkr67n/article/details/103912795
以上博客提到仍律,在c++中:
int a=0,k=1;
++a=k;//正確嘿悬,因為它使a的值+1,運算結(jié)果依然是變量a水泉,所以++a是左值表達(dá)式
//a最后的值為k的值+1
int a=0,k=1;
a++=k; //錯誤善涨,因為a++的運算結(jié)果是一個臨時變量,
//而這個臨時變量并不是你程序中定義的可尋址變量的引用草则,不能被更改钢拧,不能作為左值表達(dá)式
//a賦值錯誤
int a=0,k=1;
(a=k)=3;//正確,先執(zhí)行(a=k)炕横,這個賦值表達(dá)式的運算結(jié)果依然是變量a源内,數(shù)值上等于k的值,因此可以作為左值表達(dá)式
//a最后的值為3
實例3:
自增與解引用份殿,++的優(yōu)先級大于膜钓,但是由于是后綴,先解引用卿嘲;y==0時退出颂斜,此時y還要再+1。
int fun(char*x)
{
char*y=x;
while(*y++);
return y-x-1;
}