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
中的值分配给 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
有一个不确定的值(f.e。如果它不是用 extern
或 static
关键字声明的或在全局范围内声明的)并且你将使用该语句将此值分配给 Y
和 X
。
尽管赋值本身甚至不是非法的,但如果您使用分配的对象之一,程序将给出 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 = 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));
我是软件工程专业的一年级学生,在上一个任务中我使用了(链式赋值)多重赋值。
讲师声称这样赋值是违法的
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
中的值分配给 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
有一个不确定的值(f.e。如果它不是用 extern
或 static
关键字声明的或在全局范围内声明的)并且你将使用该语句将此值分配给 Y
和 X
。
尽管赋值本身甚至不是非法的,但如果您使用分配的对象之一,程序将给出 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 = 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));