我是软件工程专业的一年级学生,上一次任务中我使用了(链式赋值)多个变量同时赋值的方法。
但是讲师声称这种方式是不合法的。
X = Y = Z;
(这三个变量在函数开始时声明)。
如果您能解释一下赋值是否为正确操作以及老师声称的是否正确,那我会很高兴。
我是软件工程专业的一年级学生,上一次任务中我使用了(链式赋值)多个变量同时赋值的方法。
但是讲师声称这种方式是不合法的。
X = Y = Z;
(这三个变量在函数开始时声明)。
如果您能解释一下赋值是否为正确操作以及老师声称的是否正确,那我会很高兴。
这取决于在此语句之前是否正确声明了所有对象并初始化或分配了适当的值给 Z
。
由于隐式转换,您甚至可以将不同类型的对象的值赋给变量,但被赋值的对象需要能够容纳赋给它的对象的值。
如果在此之前已经初始化或赋值了 Z
并且所有对象都正确声明,则:
X = Y = Z;
这是完全正确和合法的,它将Z
中保存的值赋给Y
和X
- 赋值是从右到左进行的。
例如:
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
具有不确定的值(例如,如果它没有使用extern
或static
关键字声明或在全局范围内声明),并且您将此值分配给Y
和X
,则该语句的分配本身即使合法,但如果您使用其中一个被赋值的对象,程序将会产生未定义的结果/输出。
仅就多个赋值而言,这样做是没有任何问题的,您甚至可以使用:
O = P = Q = R = S = T = U = V = W = X = Y = Z;
如果所有使用的对象都已正确声明,并且Z
具有确定的值。
讲师声称以这种方式分配值是不合法的。
如果可能的话,我建议您向讲师或您的教师询问他/她的意思。也许有一些特定于您课程的事情需要关注。
几乎每个表达式都有一个值。
赋值是具有值的表达式。
表达式i = 42
的值为42。
赋值从右到左关联,因此表达式a = b = c
与a = (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;
。所以在这种情况下,z = 3.5,y = 3,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++);
假设a、b和c都是非易失性的,并且考虑到评估的右结合性,这意味着a = b = c等价于a = (b = c),再次等价于b = c; a = b。
#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++的处理过程如下:
步骤1:将n(100)的值赋给Z
步骤2:增加n的值(n变为101)
步骤3:将Z的值分配给Y(Y变为100)
步骤4:将Y的值分配给X(X变为100)
结论:
'单行多个赋值'是一种支持的风格。它有其优点。
但是,如果程序员不知道涉及多个赋值语句的操作顺序,那么它可能会导致读取程序的人的期望与执行的实际结果之间的不一致。
为避免这种情况,应避免使用多个赋值语句。