mooc课程精选,成品人片观看入口众乐乐,久久久久人妻一区精品性色av,苍兰诀大结局是什么,白丝美女被狂躁免费视频网站

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 關于i++的問題討論

關于i++的問題討論 時間:2018-09-29      來源:未知

這幾天在講c語言時,有學生問我 “(i++)+(++i)+(i++)”之類的問題,令我一時語塞,研究了半天。今天我要告訴你們,這樣的語句是罪惡的。你們也許要說,這明明是考試重點呀。別急,下面我們分成三個部分來組織:在第一部分中,解釋為什么它有罪;第二部分,為了解救你們,我們找出解題規律;在第三部分中,給出幾個更變態的題目,今后誰出這種題給你,你就用我這里的題目去問他。

一. 這種語句的合法性

C語言的創始人D.M.R在《CPL》中明確指出:

自增與自減運算符只能作用于變量,類似于表達式(i+j)++是非法的。

自增運算實際上包括了一個賦值運算,而表達式不能作賦值運算的左值,因為它沒有確定的內存地址。只要你明白 (i+j)=5 是非法的,那就不難理解為什么(i+j)++非法。以此為依據,(i++)+(i++)這個語句中的后一項,是非法的。盡管看起來它只是一個i++,但別忘了,在前一個i++的作用下,后面的“i”本身就已經是表達式了,表達式不能再做++。一般地,在一個語句中,對同一個變量調用多次自增或自減運算,都是非法的。D.M.R還提醒,編譯器應在這種情況下給出警告。事實上,gcc確實會對此給出一個:Warning: operation on ‘i’ may be undefined

這已經夠清楚了,無需多言。請編寫教學大綱者注意,多年以來,你們一直在用非法語句作考試重點。

二.如何解釋這種結果:

以 (i++)+(++i)+(++i)+(i++)+(i++) 為例:

計算步驟:

1. 先將所有的 i++ 改成 i ,然后在整個語句的后,統一將 i 自增相應的次數(語句中有幾個 i++,就在后自增幾次)。我們的例子,這時會變成 i+(++i)+(++i)+i+i; i++; i++; i++;

2. 按照加法的結合性,先將左起前兩項相加。如果前兩項中含有 ++i,則先算 ++i;

3. 前兩項的和作為一項,與第三項相加,以此類推。同樣,遇到 ++i,就先算 ++i。

以上就是編譯器處理這種語句的規律,當然,這并不是C語言定義的,只是編譯器在出錯情況下的無奈之舉。

三.實例如下:i=5;

1. 求j = (i++)+(++i)+(i++) 和i的值 , j=18, i = 8

按上面的方法做:

1)先把i++換到后面,變成 i + (++i) + i ; i++; i++;

2)從左到右累加,先拿出前兩項 i + (++i)。先算 ++i,i 的值變成6,兩項相加得12;

3)計算 12 +i,得18。

4)后面如果在打印i的值,則為8

2. 求j = (i++)+(i++)+(i++) 和 i 的值,j = 15, i = 8

按上面的方法做:

1)先把i++換到后面,變成 i + i + i ; i++; i++;i++;

2)從左到右累加,得到的值為15;

3)后面如果在打印i的值,則為8

3.求j = (++i)+(++i)+(++i) 和 i 的值, j = 22, i = 8

按上面的方法做:

1)從左到右累加,先拿出前兩項 (++i) + (++i),先執行兩次自增操作,第一次i的值變為6,第二次i的值變為7,然后再求值,7+7 = 14 。

2)14 + (++i) = 14+8 = 22;

3)后面如果在打印i的值,則為8

上一篇:WRTnode進階篇: usb設備移植

下一篇:Hi3515 start.S文件分析

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部