表示式具有乙個值
語句沒有值
左值=右值,賦值操作符的左運算元必須是非const的左值
賦值操作具有右結合性,當有多個賦值操作時,從右向左結合
++i是字首運算,先變後用,取i,變化內容,放入暫存器
i++是字尾運算
vc++6.0, dev-c++, gcc4.5.1環境下,彙編級只能實現兩個數相加
d=(++i)+(++i)+(++i)會被拆分成d=(++i)+(++i),d=d+(++i)所以答案是22
在vs2010下可以直接進行三次自加,然後在加總和,答案是24
c/c++編譯器編譯時,從左到右盡可能多將字元組成乙個運算子或者識別符號
++i+++j等效於++(i++)+j "++"作用於i++,不合法
%要求運算數必須是整形
前置自增可以做左值表示式,返回的是運算元本身。後置自增只能用於右值表示式,返回的是乙個臨時變數
+,-,++,–的運算級別相同,int a=-i++,運算方向是從右到左結合,所以等價於-(i++),但是後置自增是先用再加,所以是等價於int a=-i,i=i+1;
關係與邏輯運算子
if(i判定乙個整數n是否為2的正整數次冪?不是2的整倍數
if(n>1&&((n&(n-1))==0))
cout<<"yes"n-1=01111 按位與結果就為0
如果n=11000
n-1=10111按位與結果為10000
異或運算性質:相同數異或得0,且滿**換律
1,可以用於求解:1到n某乙個數缺失了,求這n-1個數中缺失的是哪乙個數
2,不用第三方變數,交換兩個變數的值
a=a^b
b=a^b
a=a^b
3,實現加法運算
int add_no_arithm(int a,int b)
4,實現求平均數
(x&y)+((x^y)>>1)
第乙個是取,x有1,y有1,該位置取1剛好是兩者的一半
第二個是,x,y兩者之中只有乙個有1的地方,取1後除2,即右移一位。
移位運算子
<< >>
int 低位補0 高位補符號位
unsigned int 低位補0 高位補0
運算子優先順序
1,括號,下標,->, . 的優先順序最好
2,單目比雙目高,算術雙目比其他雙目高
3,移位運算高於關係運算,關係運算高於按位運算,按位運算高於邏輯運算,邏輯運算高於三目運算
4,所有賦值運算優先順序相同,從右向左集合
第四章 運算子過載
目錄定義 重新定義運算子的運算 實質是函式過載,把含有運算子的表示式轉換成對運算子函式的呼叫 可以過載為普通函式 成員函式 友元函式 多次過載時,根據實參型別決定呼叫哪個運算子函式 等號只能過載為成員函式 賦值語句和初始化語句的等號 含義不同,初始化語句需要用建構函式實現 同類賦值注意點 可能包含指...
第四章 運算子的本質
陣列是存在於人們頭腦中的乙個邏輯概念,而編譯器其實並不知道有陣列這個東西,它所知道的,只是運算子,當遇到運算子的時候,編譯器只是簡單地把它轉換為類似 a i j 這樣的等價表示式,之所以是這種表示式,如前幾章所述,是因為c語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...
第四章 運算子的本質
陣列是存在於人們頭腦中的乙個邏輯概念,而編譯器其實並不知道有陣列這個東西,它所知道的,只是運算子,當遇到運算子的時候,編譯器只是簡單地把它轉換為類似 a i j 這樣的等價表示式,之所以是這種表示式,如前幾章所述,是因為c語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...