C多变量赋值

C multiple variable assignment

我是软件工程专业的一年级学生,在上一个任务中我使用了(链式赋值)多重赋值。

讲师声称这样赋值是违法的

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++);

连同求值的右结合性,假设a、b、c是非易失性的,意味着a = b = c等价于a = (b = c),又等价于b = C; a = b

这取决于是否正确声明了所有对象,并且 Z 在该语句之前是否已初始化或分配了适当的值。

由于隐式转换,您甚至可以为不同类型的对象赋值,但是被赋值的对象需要能够保存分配给这个对象的对象的值。

如果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 有一个不确定的值(f.e。如果它不是用 externstatic 关键字声明的或在全局范围内声明的)并且你将使用该语句将此值分配给 YX。 尽管赋值本身甚至不是非法的,但如果您使用分配的对象之一,程序将给出 undefined results/output.


仅针对多重赋值而言,并无违法之处,甚至可以使用:

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

如果之前使用的所有对象都已正确声明并且Z具有确定的值。


The lecturer claims that it is illegal to assign values in this way.

如果可能的话,我会问her/him或者你的老师,s/he是什么意思。也许您应该关心您课程的某些特定内容。

合法,例如:

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

它类似于 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;

在一行中为多个变量赋值是完全可以的,并且是 C 编程语言允许的。

但是,通常不鼓励使用这种样式,因为在某些情况下它可能会导致不良的副作用。

数学方程X = Y = Z的期望可能是:

Y = Z and X = Z(即,将 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;
}

输出:

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++ 处理如下:

第一步:将n(100)的值赋给Z

第2步:增加n的值(n变为101)

第三步:将Z的值赋给Y(Y变为100)

第四步:将Y的值赋给X(X变成100)

结论:

'Multiple assignments in single line' 是受支持的样式。它有它的好处。

但是,如果程序员不知道多重赋值语句中涉及的操作顺序,那么就可能导致阅读程序的人的期望与实际执行结果不一致。

为避免这种情况,不鼓励多次分配。

几乎每个表达式都有一个值。
赋值是一个有值的表达式。
表达式 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));