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