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

c語言移位和加優先順序

發布時間: 2023-04-17 12:57:19

『壹』 c語言中 移位 和 按位 和 +-*/ 的優先順序是怎麼樣的

下面是C語言中所使用的運算符的優先順序和結合性:
優先順序 運算符 結合性
(最高) () [] -> . 自左向右
! ~ ++ -- + - * & sizeof 自右向左
* / % 自左向右
+ - 自左向右
<< >> 自左向右
< <= > >= 自左向右拆敗
== != 自左向右
& 自左向右
^ 自左向右
| 自左向右
&& 自左向右
|| 自左向右
?: 自右向左
= += -= *= /= %= &= ^= |= <<= >>= 自右向左
(最低) , 自左向右
還有指針運算符、sizeof運算符、數組運算符[]等等

一、賦值運算符
賦值語句的作用是把某個常量或變數或表達式的值賦值給另一個變數。符號為『=』。這里並不是等於的意思,只是賦值,等於用『旅卜顫==』表示。
注意:賦值語句左邊的變數在程序的其他地方必須要聲明。
得已賦值的變數我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表達式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。
例如:
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為假值。
符號 功能
&& 邏輯與
|| 邏輯或
! 邏輯非
例如:
5!3;
0||-2&&5;
!4;

當表達式進行&&運算時,只要有一個為假,總的表達式就為假,只有當所有都為真時,總的式子才為真。當表達式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變數數據轉換為弊跡相應的真/假值。若原先為假,則邏輯非以後為真,若原先為真,則邏輯非以後為假。
還有一點很重要,當一個邏輯表達式的後一部分的取值不會影響整個表達式的值時,後一部分就不會進行運算了。例如:
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語言裡面的運算符優先順序如何

C語言中,運算符的運算優先順序共分為15 級。1 級最高,15 級最低。 在表達式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算符 優先順序相同時,則按運算符的結合性所規定的結合方向處理。

各等級運算符如下:

(以下說明中,對傳統的1級和2級做了細化,1和2對應傳統1級,3和4對應傳統2級,所以細化說明共有17級。)

1、基本表達式 1級

基本表達式(Primary expressions),主要是用於運算符之間,做為運算數。

標識,常量,字元串文字量,優先順序提升表達式最優先執行。

優先順序提升表達式是指圓括弧包圍的表達式,如「( expression )」


2、後綴表達式 2級

postfix-expression [ expression ],數組下標運算。

postfix-expression ( argument-expression-list),函數調用,括弧內的參數可選。

postfix-expression . identifier,成員訪問

postfix-expression -> identifier,成員訪問,->號之前應為指針。

postfix-expression ++,後綴自增

postfix-expression --,後綴自減

( type-name ) { initializer-list }

( type-name ) { initializer-list , } 復合初始化,C99後新增。

3、單目/一元運算 3級

++ unary-expression 前綴自增

-- unary-expression 前綴自減

unary-operator cast-expression 單目轉型表式式, 包括 取地址& ,提領 * , 正號+ ,負號- 位反~ 邏輯否!。

sizeof unary-expression 求類型長度,對表達式求類型長度

sizeof ( type-name ) 求類型長度


4、強制類型表達式 4級

( type-name ) cast-expression,強製表達式成為type-name指定的類型。


5、乘法表達式 5級

「 * 」 乘法運算符;「 / 」除法運算符;「 % 」 取余運算符。


6、加法運算符 6級

「 + 」加法運算符;「 - 」減法運算符。


7、移位運算符 7級

<< 左移運算符;>> 右移運算符。


8、關系運算符 8級

<、<=、>、>=關系運算符。


9、相等運算符 9級

「 == 」等於運算符;「 != 」不等於運算符。


10、位與運算符 10級

「 & 」按位與運算符


11、位異或運算符 11級

「 ∧ 」按位異或運算符(Bitwise exclusive OR operator)。


12、位或運算符 12 級

「 | 」按位或運算符(Bitwise inclusive OR operator)。


13、邏輯與運算符 13級

「&&」邏輯與運算符。


14、邏輯或運算符 14 級

「 || 」邏輯或運算符。


15、三元條件運算符 15級

? :條件運算符。


16、賦值運算符 16 級

=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=賦值運算符。


17、逗號運算符 17級

「,」逗號運算符。

具體可參見下圖:

『叄』 C語言中加號和左移位哪個優先順序高

前幾天和大學時候的兩個同學去西湖玩,一個朋友是做嵌入搜冊式的,他問我加號和左移位哪個優先順序高,我憑感覺說是圓慧左移橘漏答位高,他說錯了,其實是加法優先順序高,我平時碰到這種問題就會加個小括弧,所以沒回答對也沒在意,最近在用練習一些演算法題,用的是C語言,發現加的小括弧太多,影響可讀性,也比較麻煩。所以對C語言中的操作符的優先順序做個總結。

『肆』 C語言運算符優先順序順序

C語言運算符優先順序順序如下所示:

(4)c語言移位和加優先順序擴展閱讀

一個表達式可以包含多個運算符。在這種情況下,運算符的優先順序決定表達式的哪部分被處理為每個運算符的操作數。例如,按照運算規則,表達式中*、/、以及 % 的優先順序比 + 和 - 高。如下列表達式:

a - b * c

相當於 a-(b*c)。如果想讓操作數以不同的方式組合在一起,則必須使用括弧:

(a - b) * c

如果一個表達式中的兩個操作數具有相同的優先順序,那麼它們的結合律(associativity)決定它們的組合方式是從左到右或是從右到左。例如,算術運算符和操作數的組合方式是從左到右,賦值運算符則是從右到左。

『伍』 c語言中運算符有哪幾種,優先順序順序是怎樣

C語言中,運算符除了常見的三大類,算術運算符、關系運算符與邏輯運算符之外,還有一些用於完成特殊任務的運算符。

運算符的運算優先順序共分為15 級,1 級最高,15 級最低。 在表達式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算符 優先順序相同時,則按運算符的結合性所規定的結合方向處理。

一級運算符:標識,常量,字元串文字量,優先順序提升表達式最優先執行。

二級運算符:數組下標運算(expression)、函數調用(argument-expression-list)、成員訪問(identifier、-> identifier)、後綴自增(i++)、後綴自減(i--)、復合初始化(initializer-list)。

三級運算符:前綴自增(++i)、前綴自減(--i)、單目轉型表式式(取地址& ,提領 * , 正號+ ,負號-、位反~ 邏輯否!)、求類型長度(sizeof unary-expression)。

四級運算符:強製表達式成為type-name指定的類型( type-name ) cast-expression。

五級運算符:「 * 」 乘法運算符。

六級運算符:「 + 」加法運算符。

七級運算符:<< 左移運算符;>> 右移運算符。

八級運算符:<、<=、>、>=關系運算符。

九級運算符:「 == 」等於運算符;「 != 」不等於運算符。

十級運算符:「 & 」按位與運算符。

十一級運算符:「 ∧ 」按位異或運算符。

十二級運算符:「 | 」按位或運算符。

十三級運算符:「&&」邏輯與運算符。

十四級運算符:「 || 」邏輯或運算符。

十五級運算符:? :條件運算符。

(5)c語言移位和加優先順序擴展閱讀

C語言中各運算符的結合性:

1、左結合性(自左至右):

例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。這種自左至右的結合方向就稱為「左結合性」。

2、右結合性(自右至左)

自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算符是賦值運算符。如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z)運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。

『陸』 c語言中運算符的優先順序是如何排列的

優先順序【高到低】:

第一級:圓括弧【()】、下標運算符【[]】、分量運算符的指向結構體成員運算符【->】、結構體成員運算符【.】。

第二級:邏輯非運算符【!】、碰瞎按位取反運算符【~】、自增自減運算符【++ --】、負號運算符【-】、類型轉換運算符【(類型)】、指針運算符和取地址運算符【*和&】、長度運算符【sizeof】。

第三級:乘法運算符【*】、除法運算符【/】、取余運算符【%】。

第四級:加法運算符【+】、減法運算符【-】。

第五級:左移動運算符【<<】、右移動運算符【>>】。

第六級:關系運算符【< > <= >= 】。

第七級:等於運算符【==】、不等寬吵鉛於運算符【!=】。

第八級:按位與運算符【&】。

第九級:按位異或運算符【^】。

第十級:按位或運算符【|】。

第十一級:邏輯與運算符【&&】。

第十二級:邏輯或運算符【||】。

第十三級:條件運算符【?:】。

第十四級:賦值運算慎好符【= += -= *= /= %= >>= <<.= &= |= ^=】。

第十五級:逗號運算符【,】。



(6)c語言移位和加優先順序擴展閱讀

優先順序與求值順序無關。如(a+b)&&(b*c),雖然*優先順序最高,但這個表達式求值順序是從左到右。優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。

相同優先順序中,按結合性進行結合。大多數運算符結合性是從左到右,只有三個優先順序是從右至左結合的,它們是單目運算符、條件運算符、賦值運算符。

基本的優先順序需要記住:指針最優,單目運算優於雙目運算。如正負號。先算術運算,後移位運算,最後位運算。1<<3+2&7等價於 (1<<(3+2))&7。邏輯運算最後結合。

『柒』 c語言算術運算符優先順序

LS的說的對。1樓和2樓的說法不敢苟同。

雙目是兩個兩個操作數的運算符號,而不是是兩個符號比如++,單目是一個操作數的運算符,所以同理3目的運算符號是:?(條件表達式)。其他的我持保留態度,%,
+,
-,
*,
/等注意都是雙目運算還包括大部分移位和邏輯運算的符號,單目的運算還包括++,
--,
&(注意這個是取地址),*(這個是間接定址),!(非運算),兩張圖都或多或少有錯誤,建議你記憶優先順序的時候記住乘除的優先順序比+-高,括弧的優先順序最高就是了,需要優先計算的地方加括弧即可。

還有順便說句,請不要為了一點分忽悠初學者好么?

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

一共有十五個優先順序:
1 () [] . ->
2 ! ~ -(負號) ++ -- &(取變數地址)* (type)(強制類型) sizeof
3 * / %
4 + -
5 >> <<
6 > >= < <=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += -= *= /= %= |= ^= &= >>= <<=
15 ,
就這么多吧 結合性:2 13 14 是從右至左 其他都是 從左至右

括弧成員第一; //括弧運算符[]() 成員運算符. ->
全體單目第二; //所有的單目運算符比如++、 --、 +(正)、 -(負) 、指針運算*、&乘除餘三,加減四; //這個"余"是指取余運算即%
移位五,關系六; //移位運算符:<< >> ,關系:> < >= <= 等
等於(與)不等排第七; //即== 和!=
位與異或和位或; //這幾個都是位運算: 位與(&)異或(^)位或(|)
"三分天下"八九十;
邏輯或跟與; //邏輯運算符:|| 和 &&
十二和十一; //注意順序:優先順序(||) 低於 優先順序(&&)
條件高於賦值, //三目運算符優先順序排到13 位只比賦值運算符和","高
逗號運算級最低! //逗號運算符優先順序最低

詳見:http://www.slyar.com/blog/c-operator-priority.html

『玖』 c語言運算符優先順序從高到低的順序依次為

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

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

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

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

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

『拾』 c語言運算優先順序

優先順序就是當表達式中有多個運算符時,先計算誰,後計算誰。打個比方,在四則運算中乘除的優先順序就高於加減。

但是C語言中的運算符除了加減乘除還有很多,我們也沒必要將所有運算符的優先順序都記住,這里列出來各個運算符的優先順序表,實在需要用到的時候查一下表就行了。而且實際上在編程的時候需要考慮優先順序的情況很少,因為如果不知道優先順序高低的話,加一個括弧就行了,因為括弧的優先順序是最高的。

比如:

k = (j > i) && (8 == i)
根據優先順序的高低,完全可以寫成:

k = j > i && 8 == i
第一種寫法是比較提倡的,因為一看就知道先計算誰後計算誰,節省了大家的時間還不容易出錯。而且加圓括弧也是一種編程規范,因為程序不只是寫給自己看。

此外運算符還有「目」和「結合性」的概念。「目」就是眼睛的意思,一個運算符需要幾個數參與就歸為「幾目」。C語言中大多數運算符都是雙目的,比如 和 運算符;也有單目和三目的,單目運算符如邏輯非 ( !1 );三目運算符即條件運算符,?:也是C語言中的唯一一個三目運算符。

說完了「目」的概念,再來說一說「結合性」。先來煮個栗子:

1 + 2 × 3 / 4
上式中乘法和除法的優先順序相同,但計算的時候是從左往右,所以乘和除的結合性就是從左往右,so easy!

C語言中大多數運算符的結合性都是從左往右,只有三個運算符是從右往左的。一個是單目運算符,另一個是三目運算符,還有一個就是雙目運算符中的賦值運算符 。運算符的「結合性」也不需要死記硬背,在不斷使用中就記住了。