我是C ++世界的新手(也是C)。而且不知道它的所有细节。但有一件事让我感到困扰。
它是如下结构:
while (a=b) {...}
。据我所知,这种魔法有效,因为C和C ++中的赋值运算符会返回一些东西。
所以问题是:它返回了什么?这是一个记录在案的东西吗?它在C和C ++中的作用是否相同。关于赋值运算符及其在C和C ++中的实现的低级细节(如果存在差异)将非常感激!
我希望这个问题不会被关闭,因为从低层次的角度来看,我无法找到关于这个主题的全面解释和好材料。
答案 0 :(得分:12)
对于C ++中的内置类型,评估赋值表达式会产生一个左值,它是赋值表达式的左侧。在使用结果之前对赋值进行排序,因此当结果转换为rvalue时,您将获得新分配的值:
int a, b=5;
int &c = (a=b);
assert(&c==&a);
b=10;
assert(10==(a=b));
C几乎但不完全相同。 C中赋值表达式的结果是一个rvalue,与新分配给赋值左侧的值相同。
int *c = &(a=b); // not legal in C because you can only take the address of lvalues.
通常如果完全使用赋值的结果它被用作右值(例如a=b=c
),那么C ++和C之间的这种差异很大程度上没有引起注意。
答案 1 :(得分:6)
赋值运算符被定义为(在C中)返回分配给的变量的值 - 即表达式(a=b)
的值是表达式被评估后的a
的值
可以将它定义为C ++中用户定义的运算符重载的不同(相同类型),但我怀疑大多数人会认为这是运算符重载的非常不愉快的用法。
由于类型转换,您可以在while
(或if
等)中使用此(非布尔)值 - 使用条件上下文中的值会导致它被隐式转换在条件语境中有意义的东西。在C ++中,这是bool
,您可以通过重载operator bool()
来定义自己的转换(针对您自己的类型)。在C中,0
以外的任何内容都是真的。
答案 2 :(得分:1)
要理解这些表达式,您必须首先理解,正整数被视为'真',0被视为假。
赋值作为运算符=
的左侧进行求值。因此,while(a=b) { }
意味着,while(1 /*true*/)
如果a
被分配到b
后评估为非零。否则,它被视为while(0 /*false*/)
同样,运营商(a=b)?1:0
在分配给a
之后是b
的值..如果它不为零,那么该值将被视为true
并且将执行?
之后的语句,或执行:
之后的语句。
赋值通常计算为运算符=
左侧的值,其中逻辑运算符(例如==
,&&
等)计算为1或0。 / p>
注意:使用C ++,它将取决于某个运算符是否过载..它还将取决于重载运算符的返回类型。
答案 3 :(得分:0)
C和C ++中的赋值运算符返回赋值给它的变量的值,即它们的左操作数。在您的a = b
示例中,整个表达式的值是分配给a
的值(b
转换为a
类型的值)
因此,您可以说赋值运算符“返回”其左操作数的值。
在C ++中,它有点复杂,因为你可以使用实际的用户定义函数重载=
运算符,并让它返回除左操作数的值(和类型)之外的其他内容。