将C代码转换为仅使用goto

时间:2015-05-29 11:01:01

标签: c goto

我有以下C代码:

void BubbleSort(int a[], int array_size)
{
    int i, j, temp;
    for (i = 0; i < (array_size - 1); ++i)
    {
        for (j = 0; j < array_size - 1 - i; ++j)
        {
            if (a[j] > a[j+1])
            {
                temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}

如何仅根据goto重写此代码?

4 个答案:

答案 0 :(得分:6)

由于与{C}相比,whilefor的语义在C ++中略有改变,我认为引用C ++标准是可以的。它提供了关于forwhile如何转换为goto的直接规则(他们在第6.5节中讨论过):

while (T t = x) statement相当于

label:
{
    T t = x;
    if (t) {
        statement
        goto label;
    }
}

for (for-init-statement; condition; expression) statement相当于

{
    for-init-statement
    while ( condition ) {
        statement
        expression ;
    }
}

因此它相当于:

{
    for-init-statement
    label:
    if ( condition ) {
        statement
        expression ;
        goto label;
    }
}

答案 1 :(得分:4)

void BubbleSort(int a[], int array_size)
{
    int i, j, temp;

    // for (i = 0; i < (array_size - 1); ++i)
    i = 0;
BEGINFOR:
    if (i >= (array_size - 1)) goto ENDFOR;

    // for (j = 0; j < array_size - 1 - i; ++j)
    j = 0;
BEGININNERFOR:
    if (j >= array_size - 1 - i) goto ENDINNERFOR;

    if (a[j] > a[j+1])
    {
        temp = a[j+1];
        a[j+1] = a[j];
        a[j] = temp;
    }

    ++j;
    goto BEGININNERFOR;
ENDINNERFOR:

    ++i;
    goto BEGINFOR;
ENDFOR:
}

答案 2 :(得分:2)

要完全删除所有块,但代码看起来比原始的恕我一样丑陋

void BubbleSort(int a[], int array_size)
{
    int i, j, temp;

    // for (i = 0; i < (array_size - 1); ++i)
    i = 0;
    BEGINFOR:
    if (i >= (array_size - 1)) goto ENDFOR;

    // for (j = 0; j < array_size - 1 - i; ++j)
    j = 0;
    BEGININNERFOR:
    if (j >= array_size - 1 - i) goto ENDINNERFOR;

    if (a[j] <= a[j+1]) goto ENDOFCOMPARISON
    temp = a[j+1];
    a[j+1] = a[j];
    a[j] = temp;
    EDNOFCOMPARISON:
    ++j;
    goto BEGININNERFOR;
   ENDINNERFOR:
   ++i;
   goto BEGINFOR;
   ENDFOR:
}

答案 3 :(得分:0)

嗯......你不应该真正使用goto。永远。完全没有。 结构是

i = 0;
label:
//loop action here
i++;
if (i < somevalue)
goto label;

这是您的代码......

void BubbleSort(int a[], int array_size)
{
    int i, j, temp;
    i=0;
    first_loop:
        j = 0;
        second_loop:
            if (a[j] > a[j+1])
            {
                temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
            j++;
            if (j < array_size - 1 - 1) {
                goto second_loop;
            }
         i++;
         if (i < array_size - 1) {
            goto first_loop;
        }
}