當前位置:首頁 » 編程語言 » c語言同優先順序結合方式
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言同優先順序結合方式

發布時間: 2023-01-18 03:56:55

『壹』 c語言優先順序是什麼

c語言優先順序是:每種同類型的運算符都有內部的運算符優先順序,不同類型的運算符之間也有相應的優先順序順序。一個表達式中既可以包括相同類型的運算符,也可以包括不同類型的運算符或者函數。

當多種運算符出現在同一個表達式中時,應該先按照不同類型運算符間的優先順序進行運算。

各種運算符間的優先順序如下:數值運算符、字元串運算符、關系運算符、邏輯運算符。可以用括弧改變優先順序順序,使得括弧內的運算優先於括弧外的運算。對於多重括弧,總是由內到外強製表達式的某些部分優先運行。括弧內的運算總是最優先計算。

優先順序結合性:

當一個運算對象兩側的運算符優先順序別相同時,則按運算符的結合性來確定表達式的運算順序。關於結合性的概念在其他高級語言中是沒有的,這是C語言的特點之一。在標准C語言的文檔里,對操作符的結合性並沒有做出非常清楚的解釋。

C語言也將34種運算符規定了不同的結合性。大多數運算符結合方向是「自左至右」,即:先左後右,也叫「左結合性」

例如 a-b + c,表達式中有-和+兩種運算符,且優先順序相同,按先左後右結合方向,先圍繞減號結合,執行a-b的運算,再圍繞加號結合,完成運算(a-b) + c。除了左結合性外,C 語言有三類運算符的結合方向是從右至左,也叫「右結合性」。

『貳』 C語言的結合方向

同優先順序的結合方向:右到左
*p ++,優先順序一樣,所以p++先結合計算,然後是*()
後綴++,先引用p值,再加1
沒錯啊

『叄』 c語言優先順序相同怎麼辦

結合方向。在c語言使用方法中了解到其優先順序相同時是需要按照結合方向進行的,需要用戶進行連接,其是一門面向過程、抽象化的通用程序設計語言,廣泛應用於底層開發。

『肆』 C語言中 優先順序相同的運算符,根據結合性決定計算順序—書本上原文是不是有誤

扯吧~~~~~~

結合,自右至左沒錯
可是這說的是符號之間(同級);

但是符號的結合數有數量上的差別:
比如 符號* 這是指針上的吧??哈 *號只結合一個數
當有兩個* 比如**P 系統先識別哪一個? -->當然是自右至左了
注意:自右至左 說的是符號之間!!!
又如 + 號 - 號 是同級吧?
6+4-2 這個算式為例, 同級符號自右至左
也就是說先+ 後- 吧??
可是呢,-號和+號它們的結合數數量是兩個啊
自右至左說的是符號之間
計算機怎麼算上面的式子呢?
它是這么算的: 先算4-2; 然後再算6+*;
這就是自右至左!!!

記住,理解「自右至左」的含義!!
你看 你開始的理解應該是沒看符號吧,覺得既然同級嘛,那就是2-4+6嘍?呵呵 迷糊了吧??

理解萬歲!!!

『伍』 C語言中優先順序和結合性 例如:*p++

*p++,由於++和*的優先順序相同,結合方向為自右至左。所以確實*p++等價於*(p++),而p++其實取值的時候還是取p的,是用過之後才能+1。所以*(p++)就是先執行p++得到p,然後執行*p,得到p指向的值,等這個運算結束了才能+1。你的那個理解應該是對於*(++p)的!

『陸』 c語言運算符的優先順序順序

c語言運算符優先順序從高到低的順序依次如下:

優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。表達式的結合次序取決於表達式中各種運算符的優先順序。優先順序高的運算符先結合,優先順序低的運算符後結合,同一行中的運算符的優先順序相同。

不同類型的運算符之間也有相應的優先順序順序:

一個表達式中既可以包括相同類型的運算符,也可以包括不同類型的運算符或者函數。當多種運算符出現在同一個表達式中時,應該先按照不同類型運算符間的優先順序進行運算。

各種運算符間的優先順序如下:

數值運算符、字元串運算符、關系運算符、邏輯運算符。可以用括弧改變優先順序順序,使得括弧內的運算優先於括弧外的運算。對於多重括弧,總是由內到外強製表達式的某些部分優先運行。括弧內的運算總是最優先計算。

『柒』 c語言*pa++,同優先順序,結合方式不是自右而左嗎怎麼先算*pa,在++的

事實上是這樣的,由於是同優先順序,而且結合方式自右向左,因此先算a++,再算*pa,這是第一點;

第二,在算a++的時候,可以分為兩步,第一步,對a賦值,第二步將a=a+1;
第三,在算完a的賦值後,這時就對pa的原值進行*運算,即得到a的值,也就是在進行完第二中的第一步後就將進行*pa,然後再進行第二中的第二步即將pa中的值(即a)加1 ,這時pa將不再指向a 那麼結果就是*pa=a0; a=a0+1;

『捌』 C語言中同等級運算的先後順序

同等級的運算符,先後順序按結合性來進行。下面的代碼有利於理解結合性。
int a,b=1,c=2;
a=b=c;上面的代碼是先執行b=c呢?還是先執行a=b。如果按前者,a=結果為2,如果按後者,a的結果為1。所有的賦值符(包括復合賦值)都具有右結合性,就是在表達式中最右邊的操作最先執行,然後從右到左依次執行。這樣,c先賦值給b,然後b在賦值給a,最終a的值是2。
所有優先順序相同的操作符,它們的結合性也相同。這是必須如此的,否則結合性依然無法消除歧義,如果在計算表達式的值時需要考慮結合性,那麼最好把這個表達式一分為二或者使用括弧。
例:
a=b+c+d=是右結合的,所以先計算(b+c+d),然後再賦值給a
+是左結合的,所以先計算(b+c),然後再計算(b+c)+d
在C語言中有少數運算符在C語言標准中是有規定表達式求值的順序的:
1:&&

||
規定從左到右求值,並且在能確定整個表達式的值的時候就會停止,也就是常說的短路。
2:條件表達式的求值順序是這樣規定的:
test
?
exp1

exp2;
條件測試部分test非零,表達式exp1被求值,否則表達式exp2被求值,並且保證exp1和exp2兩者之中只有一個被求值。
3:逗號運算符的求值順序是從左到右順序求值,並且整個表達式的值等於最後一個表達式的值,注意逗號','還可以作為函數參數的分隔符,變數定義的分隔符等,這時候表達式的求值順序是沒有規定的!

『玖』 【C語言】優先順序,結合方向和執行順序

K&R的書中一再強調"C is not a big language",當時看書的時候無法理解這句話的意思。現在我的理解是C標准本身的限制比較小,留給程序員的空間較大。這樣一來C中的而有些問題標准就沒有給出限定,就會產生一些讓人迷惑的地方。今天我遇到了一個這樣的問題,解決這些問題有的時候看起來是「鑽牛角尖」,好吧,我就是一個愛鑽牛角尖的人。這里需要解決的問題是執行順序的問題,先給出幾個問題。

執行完這兩個語句後i和j的值各是什麼?(看著是不是很熟悉,上次筆試考C中是不是有這個呢)

執行完上述語句後,i和數組arry中的值是多少?

輸出結果是什麼?(來自於C Puzzle Book Operators 1.6 )
先把這幾個問題放在這里,先思考下,下面將會解決他們。

C語言經典著作 「The C Programming Language」 中對於side effects的定義:

這里述說的side effect可以理解為一種「副作用」,這種作用是改變一個變數的值。
「C In Nutshell」 中關於side effects的定義:

相對於K&R中的定義這里使用了對於環境的改變,這應該更加准確。總結:side effects 就是程序中的實體產生的改變,這里所說的實體通常指變數。
賦值,自增,自減表達式會產生side effects,函數調用表達式也有可能產生side effects。

序列點(sequence points)是一種邏輯意義的點,它的意義在於,邏輯點前的副作用(side effects)都在這時生效。C標准中定義的序列點總共有三類,第一類是完全表達式(full expression);第二類是||,&&,?:和;第三類是函數調用,在所有的參數確定後、函數真正調用之前。

標准中規定了在前一個序列點前的副作用都會在前一個序列點後完成,但是標准沒有規定兩個序列點之間的副作用生效的順序,不同的C語言實現的順序可能不同。請注意這一點,這是所有問題產生的根本原因。如果兩個序列點之間有超過兩個的副作用作用在同一個實體上,這樣不同的編譯器產生的結果就不同,這種情況在標准中稱為unspecified 。所以在實際應用中應該避免這種情況的出現,我把這一個原則稱為為SS1。

是不是遵守了SS1原則就不會產生unspecified了呢?非也。可以設想這樣一種情況:每一個實體(A)在兩個序列點之間被兩次使用,只有一次對這個實體本身產生副作用,另外一次被間接的用來產生副作用作用於另外一個實體(B)。在前面設想的這種情況下雖然符合SS1原則,但是我們會發現被間接用來產生副作用時,對於實體(B)產生的副作用肯定會跟實體(A)有關,但是這個實體(A)在這個序列點區間中有被副作用作用,那麼我們就無法確定這個實體(A)的值了,從而實體(B)也就無法確定了。這里可以歸納為:在兩個序列點之間,如果出現對一個實體的多次引用,並且只有一次會對該實體產生副作用(SS1),那麼所有的這些引用都必須用來產生這個副作用 ,我把這一個原則稱為SS2。只有同時遵守了SS1和SS2,寫出的表達式才不是unspecified類型的。

可以清晰的看到標准中使用了兩句話來概括這種問題,這正好對應於SS1,SS2原則。

下面給出更為具體的方法:
1)在一個表達式中最多隻改變一個實體。
2)如果一個實體在一個表達式被改變,並且出現次數大於一次,請保證所有實體的出現都是為了產生這個「改變」。
例如: i = i+1;
3)如果不能遵守1),那麼請保證改變的是不同的實體。
例如:c = *p++;
4)如果1)和2)都不能遵守,那麼請使用序列點將表達式分開。
例如 : (c = getchar()) != EOF && c != 『\n』;

C語言中組成程序的基本單位是表達式(expression),表達式是指用操作符(operator)和操作數(operand)連接起來的式子。C標准給出了最基本的操作符,通過這些操作符可以組成簡單表達式,同樣也可以通過復合產生復雜表達式。當一個表達式中出現多個操作符,多個操作數的時候,操作符合操作數是如何組合起來的呢?優先順序和結合方向就是用來解決這個問題的,可以這么說,優先順序和結合方向給出了一個表達式的含義,這只是說明了各個操作符和操作數是怎麼聚合起來的。

僅僅依靠優先順序和結合方向是無法確定一個復合表達式中對各個子表達式的求值順序。標准中對於這點的規定是:
兩個相鄰的操作符的執行順序由它們的優先順序決定。如果它們優先順序相同,它們的執行順序由它們的結合性決定。除此之外,編譯器可以自由決定任何順序對表達式進行求值,只要它不違反逗號,&&,||和?:操作符所施加的限制。

1)j = i++ + i++ + i++;
這個表達式違反了SS1,不同的編譯器產生的結果可能不同。
2)arry[i] = i++;
這個表達式違反了SS2,不同的編譯器產生的結果可能不同。
3)x = y = z = 1;
++x || ++y && ++z; PRINT(x, y, z);
&&的優先順序比|| 的優先順序高,所以:
++x || ++y && ++z 等效於++x || (++y && ++z)
這里就很容易犯錯,會認為先執行++y && ++z 在執行++x || ( … ),這種觀點是錯誤的,c中只對 逗號,、邏輯與 &&、
邏輯或 || 和 條件表達式規定了執行順序,對於邏輯表達式方向是從左向右執行的。本例子中,先執行 ++x = 2,邏輯
或表達式被短路,++y && ++z沒有執行,最後x = 2, y = 1, z = 1;

通過本課題的學習加深了對於c的理解,理解SS1,SS2原則。在實際應用中應該遵守「一條語句只做一件事的原則」。

『拾』 c語言中的運算符優先順序和結合性

32個運算符:
1級優先順序 左結合
() 圓括弧
[] 下標運算符
-> 指向結構體成員運算符
. 結構體成員運算符
2級優先順序 右結合
! 邏輯非運算符
~ 按位取反運算符
++ 前綴增量運算符
-- 前綴增量運算符
+ 正號運算符
- 負號運算符
(類型) 類型轉換運算符
* 指針運算符
& 地址與運算符
sizeof 長度運算符
3級優先順序 左結合
* 乘法運算符
/ 除法運算符
% 取余運算符
4級優先順序 左結合
+ 加法運算符
- 減法運算符
5級優先順序 左結合
<< 左移運算符
>> 右移運算符
6級優先順序 左結合
<、<=、>、>= 關系運算符
7級優先順序 左結合
== 等於運算符
!= 不等於運算符
8級優先順序 左結合
& 按位與運算符
9級優先順序 左結合
^ 按位異或運算符
10級優先順序 左結合
| 按位或運算符
11級優先順序 左結合
&& 邏輯與運算符
12級優先順序 左結合
|| 邏輯或運算符
13級優先順序 右結合
? : 條件運算符
14級優先順序 右結合
= += -= *= /= %= &= ^= |= <<= >>= 全為賦值運算符
15級優先順序 左結合
, 逗號運算符
回答好幾遍了=。=這些內容