結論: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++重載賦值運算符的時候講的該返回變量的引用,其實跟這個差不多
