C/C++赋值运算符实现的低级细节.它返回了什么?

Mai*_*r00 8 c c++ assignment-operator

我总是新手到C++世界(也是C).而且不知道它的所有细节.但有一件事让我感到困扰.它是如下构造: while (a=b) {...}.我理解这种魔法是有效的,因为C和C++中的赋值运算符返回了一些东西.所以问题是:它返回了什么?这是一个记录在案的东西吗?它在C和C++中的作用是否相同.关于赋值运算符及其在C和C++中的实现的低级细节(如果存在差异)将非常感激!

我希望这个问题不会被关闭,因为从低层次的角度来看,我无法找到关于这个主题的全面解释和好材料.

bam*_*s53 13

对于C++中的内置类型,评估赋值表达式会生成一个左值,它是赋值表达式的左侧.在使用结果之前对赋值进行排序,因此当结果转换为rvalue时,您将获得新分配的值:

int a, b=5;
int &c = (a=b);
assert(&c==&a);
b=10;
assert(10==(a=b));
Run Code Online (Sandbox Code Playgroud)

C几乎但不完全相同.C中赋值表达式的结果是与赋值左侧新分配的值相同的rvalue.

int *c = &(a=b); // not legal in C because you can only take the address of lvalues.
Run Code Online (Sandbox Code Playgroud)

通常,如果使用赋值的结果它被用作右值(例如a=b=c),那么C++和C之间的这种差异很大程度上没有引起注意.


Dav*_*ris 6

赋值运算符被定义为(在C中)返回分配给的变量的值 - 即表达式(a=b)的值是a表达式被计算之后的值.

它可以被定义为C++中用户定义的运算符重载的不同(相同类型),但我怀疑大多数人会认为这是一个非常不愉快的运算符重载使用.

由于类型转换,您可以在while(或if等等)中使用此(非布尔)值- 使用条件上下文中的值会使其隐式转换为在条件上下文中有意义的值.在C++中,这是bool,您可以通过重载定义自己的转换(对于您自己的类型)operator bool().在C中,除了0真实之外的任何事情.