c 中關於等運算子優先順序的運算

2021-09-07 11:57:17 字數 9265 閱讀 9807

1樓:系儉佴綾

你的四個式子是在同一個程式中的且是依此的吧?若是,運算如下i++與++i的區別:i++是先令i參加其它運算,然後再令i加1;而++i是先令i加1,然後再令i參加其它運算。--同++

對(i++)+(++j):相當於2+4=6上式運算完後i變為3,j變為4。

對--j*5+(!j==!i):

--j*5相當於3*5=15,此時j變為3,i也為3,(!j==!i)是一個邏輯表示式,其值只能是0(false)或1(true),其中只要j不為0,則!

j等於0,而0==0顯然是1(true),即整個式子相當於3*5+1=16

對於(++i==j)*++j:(++i==j)相當於(4==3)其值為0,整個式子相當於0*4=0

上式完後i,j都變為4

對於!i++*8:!i++相當於!4即為0,整個式子相當於0*8=0上式計算希望對你有幫助

2樓:欒振華菅醜

附錄cc語言運算子優先順序和結合性

優先順序運算子

含義運算型別

結合性1()

[]->

,圓括號

下標運算子

指向結構體成員運算子

結構體成員運算子

單目自左向右2!

~++--(型別關鍵字)+-

*&sizeof

邏輯非運算子

按位取反運算子

自增、自尖運算子

強制型別轉換

正、負號運算子

指標運算子

地址運算子

長度運算子

單目自右向左3*

/%乘、除、求餘運算子

雙目自左向右4+

-加、減運算子

雙目自左向右

5<<>>左移運算子

右移運算子

雙目自左向右

6<<=>>=小於、大於、小於等於、大於等於

關係自左向右7=

=!=等於、不等於

關係自左向右8&

按位與運算子

位運算自左向右9^

按位異或運算子

位運算自左向右10|

按位或運算子

位運算自左向右

11&&

邏輯與運算子

位運算自左向右

12||

邏輯或運算子

位運算自左向右13?

:條件運算子

三目自右向左14=

+=-=

*=/=

%=<<

=>>=

&=^=

|=賦值運算子

雙目自右向左15,

逗號運算

順序自左向右

3樓:曲合英李酉

c語言中,是這樣的。c++不瞭解,希望對你有幫助。

自增運算子為「+

+」,其作用是使變數的值增加1,是一個單目運算子。該運算子只能作用於單個變數,而不能用於常量或者表示式,該變數必須是整形或者字元型。因為自增運算子表示的是「在原來的基礎上增加一個」,最後的結果還要儲存到原來的變數中去。

若是常量,不符合邏輯要求。若是表示式,自增後的值沒有儲存的空間。對於浮點型變數,資料的儲存形式是複雜的,加上一位後會引起數值的混亂。

自增運算子的用法有下面兩種,分別稱之為字首自增和字尾自增:

1)++i;在使用i之前,先使i的值加1,相當於i=i+1;使用i值;

2)i+

+;在使用i之後,使i的值加1,相當於使用i值;i=i+1;

粗略的看,++i和i++對於i自身結構是相同,但兩者的不同之處在於++i是先執行自增再取i的值,而i++是先取i的值,再執行i的自增。兩個運算後i的值都會加1,只是順序不同。

(i++)+(++j)中i++的表示式結果是2,++j的表示式結果為4,故和為6。最後i為3,j為4。

關於c++運算子優先順序++和*的?

4樓:閻輝門曼雲

++a和a++含義不同啊,a++表明先執行後加減,所以還是從0開始的。

c++中的運算子優先順序順序是什麼?

5樓:匿名使用者

而動態資**肯定不能一個方

源法搞定,就像你的**bai有register.aspx、login.aspx等等,都需要你du自己來寫zhi,在我的httpserver裡,每個處理請求的

daojs模組都匯出processrequest(request,response)即可,比如實現一個register.js(只輸出字串register)

c++ 關於運算子優先順序

6樓:

因為++只是在這copy條語句結束後才+1,假設a=0,則a>a++等同於0>0,當然是錯的了,但是現在a的值變為1

補充一點,c++不提倡在同一語句當中多次修改同一個變數的值,樓主知道怎麼回事就行了,有些跟編譯器有關

7樓:匿名使用者

後置自加是「先取值,變數才加」

所以a>a++ 中,大於運算子比較的是相同的值。

8樓:匿名使用者

a>a++

等價於:

int temp = a;

temp++;

a>a;

a = temp;

9樓:

這裡不是優先順序的問題吧,a > a++ 明顯是假的。。。比如a = 2,那麼你的表示式就變成 2 > 2...能真嗎??

c++中運算子優先順序的問題

10樓:金色潛鳥

假定陣列是 int y=;

指標是 int *symbol=y; int x=222;

語句 *(symbol++)=x; 因為是字尾++, 表示式裡不自增,故計算分2步走,(版1_1) *(symbol)=x;

(1_2) symbol=symbol+1; symbol指向 &y[1]。

語句 *symbol++=x; ++優先順序高於 *, 所以類似

權上面,字尾++, 表示式裡不自增,故計算分2步走,(2_1) *symbol=x

(2_2) symbol=symbol+1; symbol指向 &y[1]。

這樣,兩者效果一樣。

11樓:gta小雞

是一樣的。 *(symbol++)等價於 *symbol++。

誰知道c++裡面的運算子的優先順序呀~~~~!!!

12樓:獨享藍山

(1)先(bai

括號)內層

,後du(括號)外層。zhi

解釋:有擴號時,dao最內層的括專號中的東西先算,再一層層屬向外。

(2)先函式,後運算。

解釋:式中有函式,例如sqrt(),fabs(),sin()之類,先算函式。

(3)先算術,後關係,再邏輯。

解釋:邏輯表示式中,混有算術運算,要先算算術(加減乘除,函式)運算,再算關係(大小,等不等)運算。最後算邏輯(或與非),得到真假。

(4)先乘除,後加減。

解釋:同算術一樣,先做乘除,後做加減。

邏輯運算子「與」又叫邏輯乘,邏輯運算子「或」,又叫邏輯加,按先乘除,後加減,「與」比「或」優先。

(5)先左,後右

解釋:同級運算,先做左邊的,後做右邊的。

(6)搞不清,加括號。

解釋:自己寫算術表示式和邏輯表示式時,搞不清運算子優先順序,可以加括號,括號裡的總是先。

13樓:匿名使用者

^c++的優先順序

優先順序 操作符 結合性

1 :: 左

2 . -> () 左

3 ++ -- ~ !專 - + & * () sizeof new delete castname_cast單目操作符 右

4 .* ->* 左

5 * / % 左

6 + - 左

7 << >> 左

8 < <= > >= 左

9 == != 左

10 & 左

11 ^屬 左

12 | 左

13 && 左

14 || 左

15 ?: 右

16 = *= /= %= += -= <<= >>= &= |= ^= 右

17 throw 左

18 , 左

14樓:匿名使用者

算數運算要注意,乘除求餘再加減

位移關係等不等,按位邏輯與異或

c++各類運算優先順序

15樓:匿名使用者

c++的優先順序

優先順序 操作符 結合

性1 :: 左

2 . -> () 左

3 ++ -- ~ ! - + & * () sizeof new delete castname_cast單目操作符 右

4 .* ->* 左

5 * / % 左

6 + - 左

7 << >> 左

8 < <= > >= 左

9 == != 左

10 & 左

11 ^ 左

12 | 左

13 && 左

14 || 左

15 ?: 右

16 = *= /= %= += -= <<= >>= &= |= ^= 右

17 throw 左

18 , 左

c的優先順序

一、賦值運算子

賦值語句的作用是把某個常量或變數或表示式的值賦值給另一個變數。符號為『=』。這裡並不是等於的意思,只是賦值,等於用『==』表示。

注意:賦值語句左邊的變數在程式的其他地方必須要宣告。

得已賦值的變數我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表示式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。

例如:count=5;

total1=total2=0;

第一個賦值語句大家都能理解。

第二個賦值語句的意思是把0同時賦值給兩個變數。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;那麼我們這樣行不行呢?

(total1=total2)=0;

這樣是不可以的,因為先要算括號裡面的,這時total1=total2是一個表示式,而賦值語句的左邊是不允許表示式存在的。

二、算術運算子

在c語言中有兩個單目和五個雙目運算子。

符號 功能

+ 單目正

- 單目負

* 乘法

/ 除法

% 取模

+ 加法

- 減法

下面是一些賦值語句的例子, 在賦值運算子右側的表示式中就使用了上面的算術運算子:

area=height*width;

num=num1+num2/num3-num4;

運算子也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。

取模運算子(%)用於計算兩個整數相除所得的餘數。例如:

a=7%4;

最終a的結果是3,因為7%4的餘數是3。

那麼有人要問了,我要想求它們的商怎麼辦呢?

b=7/4;

這樣b就是它們的商了,應該是1。

也許有人就不明白了,7/4應該是1.75,怎麼會是1呢?這裡需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。

要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變為非整數。

那麼怎樣由一個實數得到它的整數部分呢?這就需要用強制型別轉換了。例如:

a=(int) (7.0/4);

因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那麼思考一下a=(float) (7/4);最終a的結果是多少?

單目減運算子相當於取相反值,若是正值就變為負值,若是負數就變為正值。

單目加運算子沒有意義,純粹是和單目減構成一對用的。

三、邏輯運算子

邏輯運算子是根據表示式的值來返回真值或是假值。其實在c語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。

符號 功能

&& 邏輯與

|| 邏輯或

! 邏輯非

當表示式進行&&運算時,只要有一個為假,總的表示式就為假,只有當所有都為真時,總的式子才為真。當表示式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!

)運算是把相應的變數資料轉換為相應的真/假值。若原先為假,則邏輯非以後為真,若原先為真,則邏輯非以後為假。

還有一點很重要,當一個邏輯表示式的後一部分的取值不會影響整個表示式的值時,後一部分就不會進行運算了。例如:

a=2,b=1;

a||b-1;

因為a=2,為真值,所以不管b-1是不是真值,總的表示式一定為真值,這時後面的表示式就不會再計算了。

四、關係運算子

關係運算子是對兩個表示式進行比較,返回一個真/假值。

符號 功能

> 大於

< 小於

>= 大於等於

<= 小於等於

== 等於

!= 不等於

這些運算子大家都能明白,主要問題就是等於==和賦值=的區別了。

一些剛開始學習c語言的人總是對這兩個運算子弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的**:

if(amount=123) ……

很多新人都理解為如果amount等於123,就怎麼樣。其實這行**的意思是先賦值amount=123,然後判斷這個表示式是不是真值,因為結果為 123,是真值,那麼就做後面的。如果想讓當amount等於123才執行時,應該if(amount==123) ……

五、自增自減運算子

這是一類特殊的運算子,自增運算子++和自減運算子--對變數的操作結果是增加1和減少1。例如:

--couter;

couter--;

++amount;

amount++;

看這些例子裡,運算子在前面還是在後面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表示式的一部分,兩者就有區別了。運算子放在變數前面,那麼在運算之前,變數先完成自增或自減運算;如果運算子放在後面,那麼自增自減運算是在變數參加表示式的運算後再運算。這樣講可能不太清楚,看下面的例子:

num1=4;

num2=8;

a=++num1;

b=num2++;

a =++num1;這總的來看是一個賦值,把++num1的值賦給a,因為自增運算子在變數的前面,所以num1先自增加1變為5,然後賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算子在變數的後面,所以先把num2賦值給b,b應該為8,然後num2自增加1變為 9。

那麼如果出現這樣的情況我們怎麼處理呢?

c=num1+++num2;

到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以後的程式設計當中,應該儘量避免出現上面複雜的情況。

六、複合賦值運算子

在賦值運算子當中,還有一類c/c++獨有的複合賦值運算子。它們實際上是一種縮寫形式,使得對變數的改變更為簡潔。

total=total+3;

乍一看這行**,似乎有問題,這是不可能成立的。其實還是老樣子,'='是賦值不是等於。它的意思是本身的值加3,然後在賦值給本身。為了簡化,上面的**也可以寫成:

total+=3;

複合賦值運算子有下列這些:

符號 功能

+= 加法賦值

-= 減法賦值

*= 乘法賦值

/= 除法賦值

%= 模運算賦值

<<= 左移賦值

>>= 右移賦值

&= 位邏輯與賦值

|= 位邏輯或賦值

^= 位邏輯異或賦值

上面的十個複合賦值運算子中,後面五個我們到以後位運算時再說明。

那麼看了上面的複合賦值運算子,有人就會問,到底total=total+3;與total+=3;有沒有區別?答案是有的,對於a=a+1,表示式a被計算了兩次,對於複合運算子a+=1,表示式a僅計算了一次。一般的來說,這種區別對於程式的執行沒有多大影響,但是當表示式作為函式的返回值時,函式就被呼叫了兩次(以後再說明),而且如果使用普通的賦值運算子,也會加大程式的開銷,使效率降低。

七、條件運算子

條件運算子(?:)是c語言中唯一的一個三目運算子,它是對第一個表示式作真/假檢測,然後根據結果返回兩外兩個表示式中的一個。

《表示式1>?《表示式2>:《表示式3>

在運算中,首先對第一個表示式進行檢驗,如果為真,則返回表示式2的值;如果為假,則返回表示式3的值。

例如:a=(b>0)?b:-b;

當b>0時,a=b;當b不大於0時,a=-b;這就是條件表示式。其實上面的意思就是把b的絕對值賦值給a。

八、逗號運算子

在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後一個表示式的值。

假設b=2,c=7,d=5,

a1=(++b,c--,d+3);

a2=++b,c--,d+3;

對於第一行**,有三個表示式,用逗號分開,所以最終的值應該是最後一個表示式的值,也就是d+3,為8,所以a=8。對於第二行**,那麼也是有三個表示式,這時的三個表示式為a2=++b、c--、d+3,(這是因為賦值運算子比逗號運算子優先順序高)所以最終表示式的值雖然也為8,但a2=3。

還有其他的如位邏輯運算子,位移運算子等等,我們等到講位運算時再說明。

九、優先順序和結合性

從上面的逗號運算子那個例子可以看出,這些運算子計算時都有一定的順序,就好象先要算乘除後算加減一樣。優先順序和結合性是運算子兩個重要的特性,結合性又稱為計算順序,它決定組成表示式的各個部分是否參與計算以及什麼時候計算。

下面是c語言中所使用的運算子的優先順序和結合性:

優先順序 運算子 結合性

(最高) () -> . 自左向右

! ~ ++ -- + - * & sizeof 自右向左

* / % 自左向右

+ - 自左向右

<< >> 自左向右

< <= > >= 自左向右

== != 自左向右

& 自左向右

^ 自左向右

| 自左向右

&& 自左向右

|| 自左向右

?: 自右向左

= += -= *= /= %= &= ^= |= <<= >>= 自右向左

(最低) , 自左向右

C語言運算子優先順序,C語言運算子優先順序順序

優先順序運算子。名稱或含義。使用形式。結合方向說明。陣列下標。陣列名 常量表示式 左到右。圓括號 表示式 函式名 形參表 成員選擇 物件 物件。成員名。成員選擇 指標 物件指標 成員名。負號運算子。表示式。右到左單目運算子。型別 強制型別轉換。資料型別 表示式。自增運算子。變數名 變數名 單目運算子...

c中優先順序和運算子先看哪個,c語言中運算子有哪幾種,優先順序順序是怎樣

我來正確的回答吧.和 優先順序是相同的,那麼就看結合順序了。和 的結合順序 是由右至左 答案就是 iter 相當於 iter 先執行 然後執行 int test 2 std cout test test std endl 12,test 12 這個優先順序不是這個概念。iter在一起,所以從左到右 ...

關於php三元運算子的優先順序問題。請教

我勒個去來,執行了一下竟源然真是b,我還以為是a 查下了資料才知道,自己覺得有個規律,先問號,再冒號 i 2 a i 1 b c 這樣就是a b c a為真,所以是b 因為php中三來元運算子是從左向右計算源的。所以計算的步驟應該是 i 2 echo i 2 a i 1 這裡已經得出 結果是 a 後...