簡體   English   中英

C 多變量賦值

[英]C multiple variable assignment

我是軟件工程專業的一年級學生,在我的最后一項任務中,我使用了(鏈式分配)多重賦值。

講師聲稱以這種方式賦值是非法的。

X = Y = Z;

(這三個變量在函數的開頭聲明)。

如果您能向我解釋分配的行為是否正確以及老師聲稱的內容是否正確,我會很高興。

這取決於是否正確聲明了所有對象,以及在此語句之前是否對Z進行了初始化或分配了適當的值。

由於隱式轉換,您甚至可以分配不同類型的對象的值,但是被分配的 object 需要能夠保存分配給該對象的 object 的值。

如果Z之前已初始化或分配,並且所有對象都已正確聲明,則:

X = Y = Z;

完全正確且合法,因為它將Z中保存的值分配給YX - 分配從右到左進行。

例如:

int X,Y,Z;      // All objects are declared.

Z = 24;         // `Z` is assigned with the integer value 24.
X = Y = Z;      // `X` and `Y` get assigned by 24 which is the value in `Z`.

否則,如果Z有一個不確定的值(fe 如果它沒有使用externstatic關鍵字聲明或聲明在全局范圍內)並且您可以使用該語句將此值分配給YX 盡管分配本身即使在那時也不是非法的,但如果您使用分配的對象之一,程序將給出未定義的結果/輸出。


僅就多個作業而言,沒有任何違法之處,您甚至可以使用:

O = P = Q = R = S = T = U = V = W = X = Y = Z;

如果所有使用的對象之前都正確聲明並且Z具有確定的值。


講師聲稱以這種方式賦值是非法的。

如果可能的話,我會問她/他或你的老師,他/她的意思是什么。 也許您應該關心您的課程的某些特定內容。

幾乎每個表達式都有一個值。
賦值是一個有值的表達式。
表達式i = 42的值為 42。

賦值從右到左關聯,因此表達式a = b = ca = (b = c)相同。

所以

int i;
double d;
char c;
c = i = d = 42;

42轉換為double並分配給d 此分配的值為42.0
然后將該值轉換為int並分配給i 此分配的值為42
最后將int值轉換為char並分配給c

c = (i = (d = 42));

這是合法的,例如:

float x;
int y;
float z = 3.5;
x = y = z;

它類似於y = z; x = y; y = z; x = y; . 所以在這種情況下, z = 3.5, y = 3 and x = 3;

但是如果你沒有初始化 z 的值,它會給出警告。

int x,y, z;
x = 0;
y = 1;
//z = 2;
x = y = z;

只要每個變量只修改一次,它就沒有什么違法的。 例如,以下都具有明確定義的行為:

x = y = z;
x = y = z = x + 1;
x = y++ + --z;
x += (y = (z += 1)) - 6;

但以下行為未定義,應避免:

x = y = x = z;
x = x++;
x = y++ + y++
x = func(y++, y++);

Together with right-associativity of evaluation, and assuming non-volatile a, b, and c, it means that a = b = c is equivalent to a = (b = c), and again equivalent to b = c; a = b

在一行中為多個變量賦值是完全可以的,並且 C 編程語言允許。

但是,通常不鼓勵使用這種風格,因為在某些情況下它可能會導致不良的副作用。

數學方程 X = Y = Z 的期望可能是:

Y = Z 和 X = Z(IE,將 Z 的值賦給 X 和 Y)

但是 C 語言將多個賦值視為鏈,如下所示:

在 C 中, “X = Y = Z”表示必須先將 Z 的值賦給 Y,然后再將 Y 的值賦給 X。

這是一個示例程序,用於查看單行中的多個分配如何工作:

#include <stdio.h>

int main() {   
    int n;
    int X, Y, Z;
    
    printf("Enter an integer: ");  
    scanf("%d", &n);

    printf("You entered: %d\n", n);
    
    printf("Performing multiple assignments:\n X = Y = Z = n++ \n");
    X = Y = Z = n++;
    printf("n = %d\n", n);
    printf("X = %d \n", X);
    printf("Y = %d \n", Y);
    printf("Z = %d \n", Z);

    return 0;
}

Output:

Enter an integer: 100                                                                                                                                                                      
You entered: 100                                                                                                                                                                            
Performing multiple assignments:                                                                                                                                                            
 X = Y = Z = n++                                                                                                                                                                            
n = 101
X = 100
Y = 100
Z = 100

上例中需要注意的點:

行 X = Y = Z = n++ 處理如下:

第 1 步:將 n (100) 的值分配給 Z

第 2 步:增加 n 的值(n 變為 101)

第 3 步:將 Z 的值賦給 Y(Y 變為 100)

第 4 步:將 Y 的值賦給 X(X 變為 100)

結論:

“單行中的多個分配”是受支持的樣式。 它有它的好處。

但是,如果程序員不知道多重賦值語句所涉及的操作順序,就會導致閱讀程序的人的期望與實際執行結果不一致。

為了避免這種情況,不鼓勵多次分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM