賦值操作符的傳回值

來源:互聯網
上載者:User

#include<stdio.h>
void main()
{
    int a=1;
    int c;
    c=(a*=2)+(a+=3);
    printf("c=%d",c);
    getch();
}

c變數的輸出值是多少?為什麼會是16?

操作符就是將給定的數字做一些處理,然後返回一個數字。而操作符的計算也就是執行操作符的處理,並傳回值。前面已經知道,操作符是個符號,其一側或兩側都可以接數字,也就是再接其他動作符,而又由於賦值操作符也屬於一種操作符,因此操作符的執行順序變得相當重要。
對於a + b + c,將先執行a + b,再執行( a + b ) + c的操作。你可能覺得沒什麼,那麼如下,假設a之前為1:
c = ( a *= 2 ) + ( a += 3 );
上句執行後a為5。而c = ( a += 3 ) + ( a *= 2 );執行後,a就是8了。那麼c呢?結果可能會大大的出乎你的意料。前者的c為10,而後者的c為16。
         上面其實是一個障眼法,其中的“+”沒有任何意義,即之所以會從左向右執行並不是因為“+”的緣故,而是因為( a *= 2 )和( a += 3 )的優先順序相同,而按照“()”的計算順序,是從左向右來計算的。但為什麼c的值不是預想的2 + 5和4 + 8呢?因為賦值操作符的傳回值的關係。
賦值操作符返回的數字不是變數的值,而是變數對應的地址。這很重要。前面說過,光寫一個變數名就會返回相應變數的值,那是因為變數是一個映射,變數名就等同於一個地址。C++中將數字看作一個很特殊的操作符,即任何一個數字都是一個操作符。而地址就和長整型、單精確度浮點數這類一樣,是數位一種類型。當一個數字是地址類型時,作為操作符,其沒有要操作的數字,僅僅返回將此數字看作地址而標識的記憶體中的內容(用這個地址的類型來解釋)。地址可以通過多種途徑得到,如上面光寫一個變數名就可以得到其對應的地址,而得到的地址的類型也就是相應的變數的類型。如果這句話不能理解,在看過下面的類型轉換一節後應該就能瞭解了。
         所以前面的c = ( a += 3 ) + ( a *= 2 );,由於“()”的參與改變了優先順序而先執行了兩個賦值操作符,然後兩個賦值操作符都返回a的地址,然後計算“+”的值,分別計算兩邊的數字——a的地址(a的地址也是一個操作符),也就是已經執行過兩次賦值操作的a的值,得8,故最後的c為16

閱讀全文

類別:預設分類 查看評論

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.