青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

C++操作符的優先級

操作符及其結合性

功能

用法

L
L
L
::
::
::
全局作用域
類作用域
名字空間作用域
::name
class::name
namespace::name
L
L
L
L
L
.
->
[]
()
()
成員選擇
成員選擇
下標
函數調用
類型構造
object.member
pointer->member
variable[expr]
name(expr_list)
type(expr_list)
R
R
R
R
R
++
--
typeid
typeid
顯示強制類型轉換
后自增操作
后自減操作
類型ID
運行時類型ID
類型轉換
lvalue++
lvalue--
typeid(type)
typeid(expr)
cast_name<type>(expr)
R
R
R
R
R
R
R
R
R
R
R
R
R
R
sizeof
sizeof
++
--
~
!
-
+
*
&
()
new
delete
delete[]
對象的大小
類型的大小
前自增操作
前自減操作
位求反
邏輯非
一元負號
一元正號
解引用
取地址
類型轉換
創建對象
釋放對象
釋放數組
sizeof expr
sizeof(type)
++lvalue
--lvalue
~expr
!expr
-expr
+expr
*expr
&expr
(type)expr
new type
delete expr
delete []expr
L
L
->*
.*
指向成員操作的指針
指向成員操作的指針
ptr->*ptr_to_member
obj.*ptr_to_member
L
L
L
*
/
%
乘法
除法
求模(求余)
expr * expr
expr / expr
expr % expr
L
L
+
-
加法
減法
expr + expr
expr - expr
L
L
<<
>>
位左移
位右移
expr << expr
expr >> expr
L
L
L
L
<
<=
>
>=
小于
小于或等于
大于
大于或等于
expr < expr
expr <= expr
expr > expr
expr >= expr
L
R
==
!=
相等
不等
Expr == expr
Expr != expr
R & 位與 Expr & expr
R ^ 位異或 Expr ^ expr
R | 位或 Expr | expr
R && 邏輯與 Expr && expr
R || 邏輯或 Expr || expr
R ?: 條件操作 Expr ? expr : expr
R
R
R
R
R
=
*=,/=,%=
+=,-=
<<=,>>=
&=,|=,^=
賦值操作
符合賦值操作

Lvalue= expr
Lvalue+= expr
……

R throw 拋出異常 Throw expr
L , 逗號 Expr, expr
記憶方法:
--摘自《C語言程序設計實用問答》 -呂鳳翥 呂 濤著
問題:如何記住運算符的15種優先級和結合性?
解答:C語言中運算符種類比較繁多,優先級有15種,結合性有兩種。
如何記憶兩種結合性和15種優先級?下面講述一種記憶方法。
結合性有兩種,一種是自左至右,另一種是自右至左,大部分運算符的結合性是自左至右,只有單目運算符、三目運算符的賦值運算符的結合性自右至左。
優先級有15種。記憶方法如下:
記住一個最高的:構造類型的元素或成員以及小括號。
記住一個最低的:逗號運算符。
剩余的是一、二、三、賦值。
意思是單目、雙目、三目和賦值運算符。
在諸多運算符中,又分為:
算術、關系、邏輯。
兩種位操作運算符中,移位運算符在算術運算符后邊,邏輯位運算符在邏輯運算符的前面。再細分如下:
算術運算符分 *,/,%高于+,-。
關系運算符中,》,》=,《,〈=高于==,!=。
邏輯運算符中,除了邏輯求反(?。┦菃文客猓壿嬇c(&&)高于邏輯或(||)。
邏輯位運算符中,除了邏輯按位求反(~)外,按位與(&)高于按位半加(^),高于按位或(|)。
這樣就將15種優先級都記住了,再將記憶方法總結如下:
去掉一個最高的,去掉一個最低的,剩下的是一、二、三、賦值。雙目運算符中,順序為算術、關系和邏輯,移位和邏輯位插入其中。

為什么后綴++比*操作符優先級高卻后對p加1?” ——*p++、*++p、++*p和(*p)++中的操作符優先級問題
假設
int a[10]
p1=a;

那么
*p++=1;
*++p=2;
++*p=3;
(*p)++=4;

分別應該怎么按照優先級別運算?
按照書上的說法++ (后置) >++(前置) >* 解引用用 > = 等于
*p++ 是否應該是 現算(p++) 在算* 最后 賦值?
求所有的正確的算法 和解答
---------------------------------------------------------------

++(后綴)屬于“后綴操作符”,其優先級高于“前綴操作符”。
* 和++(前綴)都屬于“前綴操作符”,優先級相同,按從左到右結合的順序。都高于賦值運算符。

所以:
*p++=1 相當于 (*(p++)) = 1,也就是說++操作于p上,結果為p原來的值,再作*運算,去除引用,再賦為1??偟淖饔镁褪前裵引用的對象賦值為1,并把p加1。

*++p=2 相當于(*(++p)) = 2,也就是說++操作于p上,結果為p加1后的值,再作*運算,去除引用,再賦值為1??偟淖饔镁褪前裵加1,然后對其引用的對象賦值為2。

++*p=3 相當于(++(*p)) = 3,也就是說先對p作*運算去除引用,其結果為p引用的對象,再把這個對象+1,結果還是這個對象,再把它賦值為3。這個表達式要求對象的前綴++操作符的返回值為左值。

(*p)++=4 這里有一個強制優等級(括號),它的級別最高,結果就是((*p)++) = 4,也就是先對p作*運算去除引用,其結果為它引用的對象,然后對這個對象作后綴++操作符,結果為這個對象操作前的值(一般是一個臨時變量),然后把它賦值為4,這個表達式要求對象的后綴++操作符的返回值為左值(整數類型是不符合要求的,只對定義了這個操作符的對象類型才有可能符合要求)。

這個問題以C中很難試驗出來,在C++中可以用操作符重載的方法看清楚(操作符重載不會改變優先級):

#include <iostream>

class test
{
public:
test(){}
test(int){}
test& operator = (const test&){std::cout<<"Assignment of test" << std::endl; return *this;}
test& operator ++ (){std::cout << "Prefix ++ of test" << std:: endl; return * this;}
test& operator ++ (int) {std::cout << "Suffix ++ of test" << std::endl; return *this;}
};
class testptr
{
test Value;
public:
testptr& operator = (const test&){std::cout<<"Assignment of testptr" << std::endl; return *this;}
testptr& operator ++ (){std::cout << "Prefix ++ of testptr" << std:: endl; return * this;}
testptr& operator ++ (int) {std::cout << "Suffix ++ of testptr" << std::endl; return *this;}
test& operator *(){std::cout<< "Operator * of testptr"<<std::endl; return Value;}
};

#define TRACK(X) std::cout <<std::endl<<"***** "<< #X << " *****" <<std::endl; X
int main()
{
testptr p;
TRACK(*p++=1);
TRACK(*++p=2);
TRACK(++*p=3);
TRACK((*p)++=4);
std::cin.get();
}

輸出為
***** *p++=1 *****
Suffix ++ of testptr
Operator * of testptr
Assignment of test

***** *++p=2 *****
Prefix ++ of testptr
Operator * of testptr
Assignment of test

***** ++*p=3 *****
Operator * of testptr
Prefix ++ of test
Assignment of test

***** (*p)++=4 *****
Operator * of testptr
Suffix ++ of test
Assignment of test


int p = 1;
int a = p++;
結果a=1,并不是因為后綴++優先級低(我記得有一本C教材就是這樣寫的,真是誤人子弟),而是由后綴++的語義決定的。標準的后綴++應該是 “對操作對象做+1操作,并返回操作前的值”,它在賦值運算前運算了,但它的返回值并不是p,而是p在做+1運算前的值。因此我們還可以知道,p++的返回值應該不是一個左值,p++=a是無法編譯通過的。而前綴++則不一樣,++p的含義就是“對p做+1運算,并返回p”,其返回值就是p本身(引用),是一個左值,++p = a是可以編譯的(但沒什么意義)。

如果用代碼描述一下這兩個操作符,應該是這樣的:

const int int::operator ++(int)//后綴++
{
int temp = *this;
*this = *this +1;
return temp;
}

int& int::operator ++()//前綴++
{
*this = *this + 1;
return *this;
}


補充:
在C中,上述語句含義分別是:
*p++=1; --> temp = p + 1; *temp = 1;
*++p=2; --> p = p +1; * p = 1;
++*p=3; --> *p = *p + 1; *p = 3;
(*p)++=4;//語法錯誤,無法寫出對應的語句。

由于后綴增/減量操作符的特殊性,導致初學者很難理解“為什么后綴的++優先級高卻后對變量加1呢?”事實上,事實上,“后綴++”并不是后對變量加1,而是先做了,只是它的返回值并不是這個變量,而是這個變量改變前的值。如果對它很難理解,建議不要使用這幾個操作符,而改用普通的加/減法操作符:
*p++=1; --> *p = 1; p = p + 1;
*++p=2; --> p = p + 1; *p = 2;
++*p=3; --> *p = *p + 1; *p = 3;
(*p)++=4;//語法錯誤,無法寫出對應的語句。

由于在C++中這幾個操作符不再是整數和指針類型特有的,而是可以為類定義的,并且它們可以和+/-1操作語義不同或根本沒有加/減法操作符(如雙向迭代器),不能簡單地用加/減法代替。不過C++程序員們可以通過看比較好的類的操作符重載函數(如迭代器的)代碼真正明白后綴增/減量操作符的語義,不會因為它“優先級高卻后對變量加1”的問題糊涂。不過,僅管如此,我還是認為使用增/減量操作符時最好讓一個表達式中或者沒有增/減量操作符,或者只有一個增/減量操作符,如:++p;*p = 1;(相當于*++p = 1)或*p = 1;++p;(相當于*p++=1),這樣也不用去區分前綴和后綴的區別了。



轉自:http://blog.163.com/wjh2-316/blog/static/2787275320086810153137/
posted on 2011-04-19 13:46 會飛的兔子 閱讀(664) 評論(0)  編輯 收藏 引用 所屬分類: C++及開發環境
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区在线免费观看| 国产精品裸体一区二区三区| 日韩视频在线观看国产| 麻豆久久久9性大片| 久久久久免费视频| 欧美成人激情视频| 亚洲人成7777| 99精品欧美一区| 亚洲一区二区精品在线| 午夜视黄欧洲亚洲| 久久综合久久综合九色| 欧美国产欧美亚州国产日韩mv天天看完整| 久久亚洲精品一区| 欧美肥婆bbw| 国产伦精品一区二区三区在线观看| 国产精品女人久久久久久| 国产一区二区三区久久精品| 精品51国产黑色丝袜高跟鞋| 亚洲激情视频网| 午夜精品免费| 亚洲第一页中文字幕| 中文在线一区| 噜噜噜91成人网| 国产精品亚洲一区二区三区在线| 国产专区欧美精品| 夜夜狂射影院欧美极品| 久久精品国产精品| 亚洲精品午夜精品| 久久精品国产2020观看福利| 欧美激情网友自拍| 国语自产精品视频在线看抢先版结局 | 久久精品一区四区| 欧美专区日韩专区| 亚洲第一主播视频| 亚洲欧美制服另类日韩| 欧美成人午夜激情在线| 国产精品人人做人人爽 | 久久久久久久网站| 欧美精品在线免费| 亚洲第一福利社区| 久久精品人人做人人爽电影蜜月| 欧美成人日韩| 欧美一区二区三区久久精品茉莉花| 欧美福利精品| 美日韩精品免费| 狠狠色噜噜狠狠色综合久| 欧美一区二区三区四区在线观看地址| 欧美成人激情在线| 欧美一区二区在线视频| 欧美视频官网| 一区二区三区 在线观看视频 | 亚洲图片欧美午夜| 欧美日韩亚洲一区二区三区在线 | 午夜在线精品偷拍| 欧美午夜不卡在线观看免费| 亚洲精品免费在线| 亚洲国产欧美另类丝袜| 乱人伦精品视频在线观看| 激情成人综合网| 麻豆成人在线观看| 久久久久久夜| 91久久精品日日躁夜夜躁欧美| 久久躁狠狠躁夜夜爽| 久久精品亚洲一区二区| 国内精品久久久久久| 久久婷婷av| 蜜桃av综合| 亚洲美女在线视频| 亚洲最新色图| 一区二区三区四区五区精品| 亚洲一区精品在线| 欧美韩日一区二区| 一级日韩一区在线观看| 欧美在线一二三区| 一区二区在线免费观看| 久久精品国产77777蜜臀 | 日韩视频在线免费| 欧美日韩在线播| 亚洲一区二区三区精品动漫| 一区二区欧美激情| 在线欧美小视频| 亚洲福利久久| 免费看的黄色欧美网站| 日韩视频―中文字幕| 日韩网站在线观看| 国产伦精品免费视频| 久久夜色精品国产| 欧美久久电影| 久久gogo国模啪啪人体图| 久久久噜噜噜久久| 日韩一区二区精品| 亚洲欧美视频在线| 亚洲国产日韩一区| 亚洲欧美国产日韩天堂区| **性色生活片久久毛片| 亚洲最新视频在线播放| 国产一区自拍视频| 亚洲麻豆视频| 国产亚洲亚洲| 亚洲精品日韩精品| 韩国久久久久| 在线中文字幕一区| 亚洲国产精品久久精品怡红院| 亚洲精品一区久久久久久| 91久久国产综合久久| 欧美午夜美女看片| 免费日韩av电影| 国产精品激情| 亚洲激情啪啪| 经典三级久久| 亚洲一线二线三线久久久| 亚洲黄页视频免费观看| 亚洲欧美日韩综合aⅴ视频| 亚洲欧洲日本mm| 午夜免费久久久久| 一本一本久久a久久精品牛牛影视| 欧美一级大片在线观看| 中日韩视频在线观看| 噜噜噜噜噜久久久久久91| 小黄鸭精品aⅴ导航网站入口| 噜噜噜在线观看免费视频日韩| 久久aⅴ国产欧美74aaa| 欧美日韩一区二区三区四区五区| 老鸭窝毛片一区二区三区| 国产精品区一区| 亚洲视频网在线直播| 一区二区三区精品久久久| 六月婷婷久久| 欧美高清不卡| 欧美日韩另类国产亚洲欧美一级| 老司机午夜精品视频在线观看| 国产欧美日韩激情| 亚洲自拍啪啪| 久久不射电影网| 国产精品区二区三区日本| 一区二区三区免费看| 在线综合+亚洲+欧美中文字幕| 牛夜精品久久久久久久99黑人| 蜜桃av一区二区在线观看| 极品少妇一区二区三区| 久久精品盗摄| 欧美激情aaaa| 亚洲精品综合在线| 欧美日韩免费观看一区三区 | 欧美成人蜜桃| 欧美电影免费观看| 亚洲国产欧美一区| 欧美激情第二页| 久久综合狠狠综合久久综青草| 葵司免费一区二区三区四区五区| 亚洲一区二区精品在线| 久久婷婷丁香| 久久久福利视频| 国产伦一区二区三区色一情| 一区二区av在线| 亚洲欧美日韩在线综合| 国产精品久久久对白| 午夜精品免费| 麻豆av一区二区三区久久| 亚洲福利视频一区二区| 欧美噜噜久久久xxx| 99精品国产99久久久久久福利| 亚洲午夜国产成人av电影男同| 欧美日韩黄视频| 制服诱惑一区二区| 久久综合久色欧美综合狠狠| 亚洲二区在线| 欧美手机在线视频| 久久国产精品网站| 亚洲精品中文字幕有码专区| 亚洲一区日本| 激情另类综合| 欧美日韩岛国| 久久精品国产欧美亚洲人人爽| 欧美另类一区二区三区| 亚洲一级网站| 欧美99在线视频观看| 亚洲淫片在线视频| 亚洲国产精品久久久久秋霞影院| 蜜乳av另类精品一区二区| 亚洲最新在线视频| 美女在线一区二区| 亚洲影视在线播放| 亚洲国产日日夜夜| 国产欧美欧洲在线观看| 免费在线观看一区二区| 一区二区三区四区国产精品| 久久免费视频网| 亚洲第一成人在线| 欧美ed2k| 亚洲综合99| 国产欧美日韩精品一区| 欧美成人一区在线| 狠狠综合久久av一区二区小说| 国产日韩欧美亚洲| 国产精品99久久久久久宅男| 1024成人| 欧美jjzz| 艳女tv在线观看国产一区| 亚洲免费在线观看视频|