我有一个用户将迭代的问题列表,他们可以从任何问题开始,但他们确实有一个命令,所以为了做到这一点,我只是维护一个索引到数组并增加它像这样:
CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;
这里发生的事情并不一定明显,是否有更优雅的方式来做到这一点?
答案 0 :(得分:12)
我强烈反对在变量上使用++
,然后在同一语句中再次使用该变量。我相信这行在C#中运行良好,但是这样的行在C / C ++中是未定义的,所以它们为我举起了一个标志。我更喜欢
CurrentQuestion = (CurrentQuestion+1) % questions.Length;
我认为这是用C语言进行时钟算术的惯用方法。
答案 1 :(得分:3)
这里发生的事情并不一定明显,是否有更优雅的方式来做到这一点?
虽然对某些人来说并不是很明显,但我确切地知道这是在做什么。
但是,您可能需要考虑的是,编写可读代码比使其更聪明更重要。必须维护代码,并且您并不比编译器更聪明。
像这样编写代码,并对它感到高兴:
//ensure that the CurrentQuestion counter increments and loops back around after hitting "list max"
CurrentQuestion = CurrentQuestion + 1;
if (CurrentQuestion >= questions.Length) {
CurrentQuestion = 0;
} // meta-comment: use braces incase you have to add more later
重要的是,这段代码现在是可读的,而且它仍然是优化的。它完全正好其他代码所做的事情,我们可以在以后更改部分而无需重新阅读代码。
还要注意我在这里使用的一些语义。
CurrentQuestion = CurrentQuestion + 1;
而不是CurrentQuestion += 1;
或CurrentQuestion++;
或++CurrentQuestion;
,因为第一个更明确意图。总是写有意义的代码。答案 2 :(得分:0)
不需要条件运算符
CurrentQuestion = ++CurrentQuestion % questions.Length;
但我想你更喜欢哪一种风格比什么都重要