我最近在代码中输入错误,在某些情况下会导致无限循环(但似乎并非在所有环境中都如此)。
看起来像这样:
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,但是我似乎缺少了一些步骤(否则将没有无限循环)。
我的感觉是,它还涉及对变量的取消引用,但是我不确定是否完全了解此错误的发生。
另外,为什么在某些平台上它似乎没有引起无限循环?
答案 0 :(得分:3)
根据运算符优先级,迭代器应首先递增,然后分配给self
运算符优先级不能确定评估顺序。
如果表达式d = (a+b)*c
,a
,b
,c
和d
可以按 any 顺序求值。必须在a+b
和a
之后评估b
,在(a+b)*c
和a+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。现在,严格从右到左评估分配。这意味着现在已经保证了第一个评估顺序,而不允许第二个评估顺序。