在++ iter = iter期间会发生什么?

时间:2018-11-19 20:50:36

标签: c++

我最近在代码中输入错误,在某些情况下会导致无限循环(但似乎并非在所有环境中都如此)。
看起来像这样:

  public Map<List<String>, List<Integer>> task4() {

    Session session = this.sessionFactory.getCurrentSession();

    String genre  = "SELECT book.genre FROM Book book  GROUP BY genre";
    SQLQuery query= session.createSQLQuery(genre);
    List<String>  genreList = query.list();

    String count = "SELECT  COUNT(genre) AS counter FROM book book  GROUP BY genre";
    query= session.createSQLQuery(count);
    List<Integer>  countList = query.list();

    Map<List<String>, List<Integer>> task4List = new Hashtable<List<String>, List<Integer>>();
    task4List.put(genreList,countList);

    return task4List;

}

错别字是迭代器对其自身的分配。删除它可以解决问题。

我想知道++ iter = iter语句究竟发生了什么?
我认为根据运算符的优先级,应该首先将迭代器增加,然后再分配给self,但是我似乎缺少了一些步骤(否则将没有无限循环)。
我的感觉是,它还涉及对变量的取消引用,但是我不确定是否完全了解此错误的发生。
另外,为什么在某些平台上它似乎没有引起无限循环?

1 个答案:

答案 0 :(得分:3)

  

根据运算符优先级,迭代器应首先递增,然后分配给self

运算符优先级不能确定评估顺序。

如果表达式d = (a+b)*cabcd可以按 any 顺序求值。必须在a+ba之后评估b,在(a+b)*ca+b之后评估c,并在{ {1}}和乘法结果,仅此而已。

以前的情况相同与赋值。

以前,分配的左侧和右侧可以按任意顺序求值。特别是,可以实现以下命令

  • d被求值,得到一个我们称为iter
  • 的值 对
  • temp进行了评估(这不会影响++iter
    • 这将导致temp的增量,并且该值是新增加的iter rvalue
  • iter分配给上面评估的temp rvalue
  • 最终结果是iter不变

另一个评估顺序过去也是可能的。

  • iter被评估
    • 这将导致++iter的增量,并且该值是新增加的iter rvalue
  • 再次评估
  • iter(作业的右侧)
    • 结果是新增加的iter转换为 lvalue
  • 进行分配,使iter按预期递增。

但是C ++ 17 has changed this。现在,严格从右到左评估分配。这意味着现在已经保证了第一个评估顺序,而不允许第二个评估顺序。