对于我的类,我们使用两个编译器,xcode 和 codeboard,其中代码板是两者中更严格的,并且有一个预设断言列表来测试你的代码。在我的函数 a 代码中,我有嵌套循环,我希望 i 始终领先于 k 一个。它在 xcode 中工作正常,但在代码板上给我带来了分段错误。
for (int k = 0; k <= n-2; k++) {
for (int i = k+1; i <= n-1; i++) {
if (array[k] == array[i])
奇怪的是,如果我使用 k++ 或 ++k 而不是 k+1,它不会导致分段错误,但我的代码不会传递所有断言。我以为它们应该是一回事?
更奇怪的是,如果我在函数 b 中使用 k+1,它不会导致代码板错误。
for (int k = 0; k <= n-1; k++) {
for (int i = k+1; i <= n-1; i++) {
if (array[k] > array[i])
基本上,这里发生了什么?
编辑:所以,我从每个人那里得到的是,当我在内循环中使用i = k + 1时,它会增加外循环中的k值。比如,如果 k=1,i=2,那么当它回到外循环时,k=3。如果是这样的话,我该如何让我保持领先于k?
编辑:请忽略我问题的 k++ 和 k+1 部分,这不是我的主要问题,只是一个让我感到困惑的侧面,但现在我明白了。我会从我的帖子中删除那部分,但我很确定这是不允许的。我的主要问题是如何保持我的 i 值 1 大于我的 k 值。
在下面的代码中,目标是如果任何数组值相同,则在某个时候它应该为 true。关于可重复的结果:
string a[3] = {"aaa", "bbbb", "cccc"};
int n = 3;
for (int k = 0; k <= n-2; k++) {
int b = 0;
for (int i = k+1; i <= n-1; i++) {
if (a[k] == a[i])
b++;
}
if (b != 0) {
cout << "true" << endl;
break;
}
else
cout << "false" << endl;
}
不,它们不一样:
k + 1
返回k
加 1 的值,但不更改k
本身的值。
++k
将 1 加到k
并返回新值(前递增(。
k++
还向k
加 1,但返回以前的值k
(后递增(。
k++
和++k
都k
增加 1,从而更改k
的值。
k+1
没有。
您的分段错误来自这样一个事实,即每次评估初始 for 循环时,以及每次初始化第二个 for 循环时,您都会增加k
。这意味着您在循环结束时读取的比数组更远。
k++ 和 k+1 并不相同。
如果在所显示的代码中使用 k++ 而不是循环中的 k+1,则实际上是在对变量 k 执行两个增量,这通常不是您在循环的控制变量中想要的。
- K+1 不会改变 k 的值。
- k++ 在使用其值后递增 k。
- ++k 在使用其值之前递增 k。
所以基本上发生的事情是,每次你启动内部循环时,k都会递增。但是在外部循环的最后一轮中,当 k 等于 n-1 时,你执行另一个增量,将 k 设置为 n,这肯定不是你想要的。