賦值表示式的值等於右值
1 #include <stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int i; 6 //當賦值為0時賦值表示式代表的邏輯值為假,所以下列語句不會執行 7 if (i=0) { 8 printf("i=0\n"); 9 } 10 //當賦值為非0時賦值表示式代表的邏輯值為真,所以下列語句會執行 11 if (i=1) { 12 printf("i=1\n"); 13 } 14 //當賦值為非0時賦值表示式代表的邏輯值為真,所以下列語句會執行15 if (i=-1) { 16 printf("i=-1\n"); 17 } 18 //逗號表示式代表的邏輯值為最後一個表示式的邏輯值,所以下列語句不會執行 19 if (i=1,i=0) { 20 printf("i=1,i=0\n"); 21 } 22 //逗號表示式代表的邏輯值為最後一個表示式的邏輯值,所以下列語句會執行 23 if (i=0,i=1) { 24 printf("i=0,i=1\n"); 25 } 26 27 28 29 return 0; 30 }
賦值表示式的值為何總是右值而不是左值?
我估計,按賦值表示式的語意,等號的左邊總是“可寫”的,右邊總是“可讀”的。如果賦值表示式的值是左邊的值,那麼程式需要重新計算等號左邊的值才能返回,這帶來兩個問題,一是效能,二是左邊的物件不一定可讀(例如那些可寫但不可讀的屬性)。於是,幾乎所有語言都將“所賦的值”作為賦值語句的返回值,所以連續賦值語句的行為總是“計算最右值一次,從右向左賦值多次”。
但是,對於coffee的解構賦值表示式,情況則有點不同,因為coffee必須將該表示式拆分成兩個,當c是一個包含副作用的屬性時,a=b=c 和 b=c;a=c; 並不是等價的。所以,對於解構賦值表示式,等號右邊的表示式實際將會求值多次。