希望我能对我做的排序方法有所建议。
这只是对我正在制作的另一个程序的测试,而该测试有一个我无法弄清的错误。这段代码的目的是创建一个int指针数组,并根据常规int数组的内容对该数组中的指针进行排序。
该错误是针对我的第二个for循环的,该循环不允许我使用aj!=-1,因此不允许我对数组的第一个元素进行排序。请帮忙。谢谢!!
//create array
int c[8] = {3,1,5,7,8,2,6,4};
//create pointer array
int *newptr[8];
for(int k = 0; k<8; k++)
{
newptr[k] = &c[k];
}
//sort pointer array
for(int j = 0; j<8; j++)
{
cout << "test1\n\n";
cout << *newptr[j] << "and" << *newptr[j+1];
for(;*newptr[j] < *newptr[j+1] && j!=0; j--)
//using j!=-1 doesn't work which causes me to not be able to sort the first element
//in the array properly
{
cout<< "test2";
int *temp;
temp = newptr[j+1];
newptr[j+1] = newptr[j];
newptr[j] = temp;
}
}**
顺序很重要。
改变
for(;*newptr[j] < *newptr[j+1] && j!=0; j--)
到:
for(; j != -1 && *newptr[j] < *newptr[j+1]; j--)
大概该错误是导致代码崩溃的原因。发生这种情况是因为for循环中的表达式是从左到右求值的。因此在检查是否*newptr[j]
被评估之前j != -1
。因此可以想象,在某些时候,j
它等于“-1
何时*newptr[j]
进行评估”,这是非法的。
更改顺序确实有所不同,其第二个原因是:短路评估。
当评估两个由两个条件A
和组成的表达式时B
,C ++并不总是需要评估两个条件。
例如在声明中
if (A && B) {
//do something
}
如果A
评估为false
,则无论A && B
评估结果true
如何,显然都无法评估B
。因此,B
永远不会检查的值。因此,在您的情况下,在表达式中
j != -1 && *newptr[j] < *newptr[j+1]
如果j != -1
为假,则C ++无需评估表达式的其余部分即可知道整个表达式为假。因此,*newptr[j]
永远不会发生,您也不会发现错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句