C語言賦值運算符的返回值


結論:C語言賦值運算符返回的是左值的地址

今天看C陷阱與缺陷,又看到了一處提到strcpy,下面有庫里面的實現的代碼:

//這是整理過的,不是原書的代碼
char *strcpy(char *dest, const char *src)
{
  assert(dest!=NULL && src!=NULL);
  char *str=dest;
  while ((*dest++=*src++)!='\0');
  return str;
}

while ((*dest++=*src++)!='\0'); 這一句讓我想了很久,以前一直認為賦值運算符返回的是是否復制成功,現在看起來它應該返回的是左值的值。

於是我去搜索了一下,排除好多講C++重載的文章后,終於發現了一篇賦值運算符的返回值

其中有一個例子,先來看看:

#include <stdio.h>

int main()
{
    int a = 1;
    int c = (a*=2) + (a+=3);
    printf("a = %d, c = %d\n", a, c);
    return 0;
}

如果賦值運算符返回左值的值的話,(a*=2)和(a+=3)應該返回2和5,那么結果應該是a = 5, c = 7。如果是這樣,后面也不用寫了。事實上結果讓我吃了一驚,這個例子的結果如下:

a = 5, c = 10

其實C語言的賦值運算符會返回左值的地址而不是值,上面的代碼就相當於在a*=2,和a+=3執行完后將兩個a相加。

下面再來看一個例子

#include <stdio.h>

int main()
{
    int a = 1;
    printf("%d, %d, a = %d\n", (a*=2), (a+=3), a);
    return 0;
}

這個例子會輸出什么呢?

5, 5, a = 5 么?

忘了printf壓棧是從右至左的。它會輸出:

8, 8, a = 8

回頭想想C++重載賦值運算符的時候講的該返回變量的引用,其實跟這個差不多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM