C 語言基礎(chǔ)教程(我的C之旅開始了)[九]
24. +、-、*、/、= 的優(yōu)先級(jí)
1. 優(yōu)先級(jí) 和數(shù)學(xué)一樣,C 語言規(guī)定先乘除后加減。也就是說,乘法運(yùn)算符和除法運(yùn)算符的優(yōu)先級(jí)(Precedence)比加法運(yùn)算符和減法運(yùn)算符高。同時(shí),C 語言也規(guī)定,如果兩個(gè)運(yùn)算符的優(yōu)先級(jí)相同,并且它們之間沒有被優(yōu)先級(jí)比它們高或者低的運(yùn)算符隔開,則它們的運(yùn)算順序根據(jù)它們?cè)谡Z句中出現(xiàn)的先后而定。大多數(shù)運(yùn)算符都是從左向右進(jìn)行運(yùn)算的,不過也有從右向左進(jìn)行運(yùn)算的(例如賦值運(yùn)算符)。乘法運(yùn)算符和除法運(yùn)算符的優(yōu)先級(jí)相同,加法運(yùn)算符和減法運(yùn)算符的優(yōu)先級(jí)相同。因此,以下語句 var = 8.0 + 20.0 / 4.0 * 2.0; 運(yùn)算順序?yàn)椋?/P>
20.0 / 4.0 在這個(gè)表達(dá)式中,/ 和 * 優(yōu)先級(jí)相同,而且是從左向右進(jìn)行運(yùn)算的,所以先運(yùn)算 20.0 / 4.0,然后才輪到 5.0 * 2.0。 如果我們想讓加法先進(jìn)行,可以給 8.0 + 20.0 加上括號(hào): var = (8.0 + 20.0) / 4.0 * 2.0; 這個(gè)語句的運(yùn)算順序?yàn)椋?/P>
8.0 + 20.0 C 語言規(guī)定,先進(jìn)行括號(hào)里面的運(yùn)算,后進(jìn)行括號(hào)外面的運(yùn)算。在括號(hào)里面,運(yùn)算順序和上面討論的一樣。例如: var = (8.0 + 20.0 / 4.0 * 2.0) / 3.0; 運(yùn)算順序?yàn)椋?/P>
20.0 / 4.0 下表總結(jié)了這幾個(gè)運(yùn)算符的優(yōu)先級(jí)以及它們的結(jié)合律,按優(yōu)先級(jí)從高到低進(jìn)行排列 運(yùn)算符 結(jié)合律 () 從左向右 運(yùn)算符優(yōu)先級(jí)(Operator precedence)是決定運(yùn)算順序的重要規(guī)則,但不能完全(也沒必要完全)確定運(yùn)算順序。例如: 5 * 3 + 8 * 4; 根據(jù)運(yùn)算符優(yōu)先級(jí),我們知道,乘法運(yùn)算先于加法運(yùn)算。但是 5 * 3 和 8 * 4 誰先誰后,我們并不能確定。它們運(yùn)算的先后是由編譯器決定的。這是因?yàn)槟撤N運(yùn)算順序在某種系統(tǒng)中效率更高,而另一種運(yùn)算順序在另一種系統(tǒng)中效率更高。無論它們的運(yùn)算先后如何,最終得到的結(jié)果都是 47。 您可能會(huì)說:“乘法不是從左向右進(jìn)行運(yùn)算的嗎?這不是說明最左邊的乘法最先進(jìn)行嗎?”是的,乘法的確是從左向右進(jìn)行運(yùn)算,但是您也要看到,這兩個(gè)乘法運(yùn)算符之間被加法運(yùn)算符隔開了!我們舉一個(gè)例子來說明乘法從左向右進(jìn)行運(yùn)算的意思。以下語句 5 * 2 * 9 * 4; 運(yùn)算順序?yàn)椋?/P>
5 * 2 /* precedence.c -- 優(yōu)先級(jí)測(cè)試 */ int main(void) var1 = var2 = -(9 + 4) * 5 + (6 + 8 * (7 - 1)); return 0; 請(qǐng)認(rèn)真閱讀以上程序,想想會(huì)出現(xiàn)什么結(jié)果,然后編譯運(yùn)行,看看運(yùn)行結(jié)果和您想象的是否一樣。 首先,括號(hào)運(yùn)算符優(yōu)先級(jí)最高。但是 (9 + 4) 和 (6 + 8 * (7 - 1)) 運(yùn)算的先后是由編譯器決定的。假設(shè) (9 + 4) 先進(jìn)行,則運(yùn)算后得 13,然后負(fù)號(hào)運(yùn)算符作用于 13 得 -13。于是我們得到: var1 = var2 = -13 * 5 + (6 + 8 * (7 - 1)); 在 (6 + 8 * (7 - 1)) 中,先運(yùn)算 (7 - 1),得: var1 = var2 = -13 * 5 + (6 + 8 * 6); 因?yàn)?* 優(yōu)先級(jí)高于 +,于是我們得到: var1 = var2 = -13 * 5 + (6 + 48); 進(jìn)而 var1 = var2 = -13 * 5 + 54; 因?yàn)?FONT color=#ff0000>賦值運(yùn)算是從右向左的,所以 -11 被賦值給 var2,接著 var2 被賦值給 var1。最終的結(jié)果是,var1 和 var2 相等,它們的值都是 -11。
5.0 * 2.0 (20.0 / 4.0 得 5.0)
8.0 + 10.0
var = 18.0
28.0 / 4.0
7.0 * 2.0
var = 14.0
5.0 * 2.0
8.0 + 10.0
18.0 / 3.0
var = 6.0
+ -(單目) 從右向左
* / 從左向右
+ -(二目) 從左向右
= 從右向左
2. 優(yōu)先級(jí)和運(yùn)算順序
10 * 9
90 * 4
下面我們來看一個(gè)小程序。
#include <stdio.h>
{
int var1, var2;
printf("var1 = var2 = %d\n", var1);
}
var1 = var2 = -65 + 54;
var1 = var2 = -11;
25. 模除運(yùn)算符 % | |||
% 是模除運(yùn)算符(Modulus Operator),用于求余數(shù)。% 只可用于對(duì)整數(shù)進(jìn)行模除,不可用于浮點(diǎn)數(shù)。例如: 15 % 2 // 正確。余數(shù)為 1 C99 以前,并沒有規(guī)定如果操作數(shù)中有負(fù)數(shù),模除的結(jié)果會(huì)是什么。C99 規(guī)定,如果 % 左邊的操作數(shù)是正數(shù),模除的結(jié)果也是正數(shù);如果 % 左邊的操作數(shù)是負(fù)數(shù),模除的結(jié)果就是負(fù)數(shù)。例如: 15 % 2 // 余 1 標(biāo)準(zhǔn)規(guī)定,如果 a 和 b 都是整數(shù),則 a % b 可以用公式 a - (a / b) * b 算出。例如: -15 % 2 == -15 - (-15 / 2) * 2 == -15 - (-7) * 2 == -1 最后,我們看一個(gè)小程序。 /* months_to_year.c -- 將用戶輸入的月數(shù)轉(zhuǎn)換成年數(shù)和月數(shù) */ #include <stdio.h> printf("Enter the number of months: "); years = months / months_per_year; /* 算出年數(shù) */ printf("%d months is %d years, %d months.\n", months, years, months_left); return 0;
|
相關(guān)文章
結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法
這篇文章主要介紹了C++中l(wèi)ambda表達(dá)式的用法,lambda表達(dá)式的引入可謂是C++11中的一大亮點(diǎn),同時(shí)文中也涉及到了C++14標(biāo)準(zhǔn)中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下2016-01-01C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06