我刚刚从竞争性编程开始,并且一直使用类似下面的循环来定义大多数练习问题中的测试用例数。
for(int i=1;i<=t;i++)
{
...
}
但是,我看到有人使用了一个只有条件的while循环
(t--)
运行完全没问题。有人能向我解释这种情况究竟是如何起作用的吗?它是否与while(t!=0)
相同,但是在循环中后面的值中减去了,我们在这里做了吗?
答案 0 :(得分:4)
重复执行while
循环的主体,直到其条件的值变为假(请注意,如果条件最初为假,则循环将根本不执行)。条件测试在每次执行循环体之前进行。现在,让我们说你有这个:
int x = 5;
while(x--)
{
cout << x;
}
每次迭代都将评估while循环的条件并检查false
。由于我们使用postfix减量,首先使用x
(即检查false
以打破循环),然后减少,这意味着上面的循环将打印43210
,然后完成
值得注意的是,在循环结束后,x
的值将为-1。
答案 1 :(得分:3)
是。
int t = 5;
while(t--){...}
在检查其值时,运行循环直到t
为0
,因为0
在逻辑上下文中与false
同等。
因为t--
是t
上的后递减运算符,所以在while
检查后它的值将被修改,因此它最终将为-1。因此,循环内t
的值将为:4,3,2,1,0。
但是它在循环范围之外创建了一个额外的变量 - 所以我更喜欢for
循环。
答案 2 :(得分:0)
如果没有其他理由,我会总是写一个这样的循环:
const int tmax = 3;
for (int t=0;t<tmax;t++){std::cout << t << std::endl;}
如果您只关心循环执行的次数,但循环内部不需要t
的值,则实际上没有理由使用其他东西。但是,如果你想倒计时,你可以这样做:
for (int t=tmax;t!=0;t--){std::cout << t << std::endl;}
或
for (int t=0;t<tmax;t++){std::cout << tmax - t << std::endl;}
哪一个可能都认为是丑陋的(我个人不喜欢第一个太多,因为我是一个尽可能计算for循环的奉献者。第二个不好,因为你可能会使用值{{1}在循环内多次,即你引入了一个额外的变量或错误的机会)并且更喜欢写
tmax-t
在循环之外引入额外变量几乎没有什么意义。但是,当int t = tmax;
while (t--){std::cout << t << std::endl;}
不是const并且循环之后不需要该值时,可能是编写循环的最紧凑方式是:
tmax
我很确定它们在性能上都是一样的,它只是关于你喜欢的编码风格,但我希望我能给你一个提示,为什么有人会更喜欢一个而不是另一个。
答案 3 :(得分:0)
while(x--)
的结果评估为x--
/ false
后, 0
停止
int x = 5;
while (x--) {
;// do something
}
由于后递减,x在循环结束后的值为-1
。
答案 4 :(得分:0)
while(x--)
此循环将运行'x'次,并且由于x--是后减运算符,因此它将首先检查x的值是否为非零,然后再将其递减。
因此,如果您尝试在循环中打印x的值,它们将是, x-1 2倍 。 。 0
答案 5 :(得分:0)
有两种方法可以从0遍历到9。
第一-0 1 2 3 4 5 6 7 8 9 以第一种方式遍历您需要
for(x=0; x !=9; x++){
cout << x;
}
秒-9 8 7 6 5 4 3 2 1 0 以第二种方式遍历,您需要此循环
for(x=9; x !=0; x--){
cout << x;
}
答案 6 :(得分:0)
在这里,while循环参数中的值也可以执行布尔函数。这意味着如果要在while循环参数中提供任何False值
while(Any False value/Negative Value){
While循环将中断,并且不会进一步执行。在上述示例中,当while(t--)
开始执行时,请使用后减量,这意味着如果t = 5的值将首先执行循环,然后减小循环,直到t的值变为负数为止,即- 1,条件变为FALSE,循环将终止。
答案 7 :(得分:0)
两者实际上是相同的。
while(t--)也运行测试用例't'次,因为t的值在每次迭代中都会减小,与for循环相同。这只是编写循环的另一种方式,甚至可以节省解决问题的时间。