GOTO command in C



我尝试使用GOTO(第一次使用in(对5个整数数组进行排序,但我已经调试了这个代码,我不明白为什么它不起作用,我不完全理解如何使用GOTO,为什么我被困在swapp循环中,有什么帮助吗?

int* sort5integersIFGOTO(int* arr)
{
int i = 0, j = 1;
start:
if (arr[i] > arr[j])
goto swapp;
swapp:
swap(&arr[i], &arr[j]);
if (j < 4)
{
j++;
goto start;
}
if (i < 3)
{
i++;
j = i+1;
goto start;
}
return arr;
}

这段代码:

if (arr[i] > arr[j])
goto swapp;
swapp:
swap(&arr[i], &arr[j]);

always也做同样的事情——如果测试为true,它会跳到标签(在下一行(,如果测试为false,它就会跳到标签。因此,比较的结果是无关紧要的,而且它总是互换的。你可能想要

if (arr[i] > arr[j])
swap(&arr[i], &arr[j]);

根本没有标签或goto。。。

对于初学者来说,总是尝试编写更通用的函数,例如可以对各种大小的数组进行排序。

此外,函数CCD_ 2的返回类型CCD_。通常这样的函数具有返回类型void

您的功能不正确。例如,如果arr[i]不大于arr[j],则控制被传递到if语句后面的标签swapp下的语句,并且在任何情况下,数组的两个元素被交换。

start:
if (arr[i] > arr[j])
goto swapp;
swapp:
swap(&arr[i], &arr[j]);

在函数中也使用了不清楚的幻数作为34,尽管从描述中所传递的数组具有5元素。

该功能可以通过以下方式进行定义,如下面的演示程序所示。

#include <stdio.h>
void swap( int *a, int *b )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void sort5integersIFGOTO( int *arr, size_t n )
{
size_t i = 0;

start:
if ( i < n )
{
size_t j = i;

next:
if ( ++j < n )
{
if ( arr[j] < arr[i] )
{
swap( arr + i, arr + j );
}
goto next;
}
else
{
++i;
goto start;
}
}       
}
int main(void) 
{
int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
const size_t N = sizeof( arr ) / sizeof( *arr );

for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", arr[i] );
}
putchar( 'n' ); 
sort5integersIFGOTO( arr, N );

for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", arr[i] );
}
putchar( 'n' ); 
}

程序输出为

9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9

正如您所看到的,函数中没有使用幻数。函数可以对各种大小的数组进行排序。

使用for循环而不是int *0语句重写函数并不困难。例如

void sort5integersIFGOTO( int *arr, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = i; ++j < n; )
{
if ( arr[j] < arr[i] )
{
swap( arr + i, arr + j );
}
}
}
}

最新更新