c++ - 双重赋值的评价顺序

标签 c++

我在我们的代码库中发现了一些东西,即使它从未失败过,但对我来说并不“正确”。

我已将代码精简为类似于链表的内容(数据结构比这复杂得多)。

Node * node = firstNode();

while( moreNodesAwaiting() )
{
    Node * newnode = giveMeAnotherNode();

    node = node->next = newnode ; // <-- This is what I don't like.
}

我不确定未定义的行为是否适用于此。我们在序列点之间同时修改数据结构和指向它的指针,但这与修改值两次不同。

此外,如果编译器可以按任何顺序计算表达式的元素,是否意味着它可以在赋值发生之前计算node->next

为了以防万一,我把它改成了这样的:

    node->next = newnode ;
    node = node->next    ;

这也强调了我们遍历列表这一事实。

最佳答案

赋值从右到左关联。换句话说:

a = b = c;

被解析为

a = (b = c);

并且此顺序由标准保证。

也就是说,对于基本类型,它将把c赋给ba。对于非原始类型,它将调用 a.operator= (b.operator= (c))

关于c++ - 双重赋值的评价顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276766/

相关文章:

c++ - 设置小数点前数字的精度?

C++ 中的 Java 模式替换(库)

c++ - 头文件中的类声明和定义是否会在每个包含文件中进行编译?

c++ - 为什么 64 位 VC++ 编译器在函数调用后添加 nop 指令?

c++ - 计算哈希表中字符串出现的次数

c++ - 我的 g++ 使用 vector<weak_ptr> erase() 方法生成奇怪的警告

C++ 接口(interface)类继承自具体类是否合理?

c++ - 关于如何在 C++ 中处理不同项目中的文件所需的类(class)

c++ - 给定一个 DDS 主题名称,是否可以在运行时确定主题类型信息?

c++ - 关于c++中的结构填充