繁体   English   中英

在 C 语言中是否可以在没有任何循环的情况下打印数组?

[英]Is printing array possible without any loop in the C Language?

例如,在 Python 中,如果我们将列表作为数组,它会直接打印整个数组,用于一行代码。 有什么办法,用 C 语言实现同样的事情吗?

简短的回答

对表格上几乎所有问题的简短回答“你能在 C 中像 Python 一样简单地做 X 吗?”

长答案

这取决于你的意思。 在内部,Python 也适用于循环。 它只是对你隐藏,所有编程语言也是如此。 如果你想处理一个数组,你通常需要一个循环。

因此,如果您的问题是是否有一些预定义的函数用于打印 arrays,那么答案是否定的,前提是数组不是字符串。 但是为此编写一个自定义打印 function 并不难。 这是一个打印得相当漂亮的示例:

void print_int_array(int *arr, size_t size) {
    if (size == 0) {
        printf("[]");
    } else {     
        putchar('[');
        for (int i = 0; i < size - 1; i++)
            printf("%d, ", arr[i]);
        printf("%d]", arr[size - 1]);
    }
}

也可以使用递归,但递归基本上只是变相的循环。 这是上述的递归版本:

void print_int_array_rec(int *arr, size_t size) {
    if (size == 0) {
        putchar(']');
    } else {
        printf("%d", *arr);
        if (size == 1) 
             printf(", ");
        print_int_array_rec(arr + 1, size - 1);
    } 
}

void print_int_array(int *arr, size_t size) {
    putchar('[');
    
    print_int_array_rec(arr, size);
}

但正如我所说,它基本上只是一个变相的循环。 至少在这个简单的情况下。 所有循环通常在汇编中转换成这样的东西:

loop_start:
    // Code

    if(<condition>) goto loop_start

或者使用嵌套循环:

loop_start:
    // Code
loop2_start:
    // Code
    if(<condition>) goto loop2_start
    // Code
    if(<condition>) goto loop_start

通过递归,这些跳转会变得更加复杂。 如果您使用复杂的递归,跳转可能会停止正确嵌套。 它可能会导致这样的事情:

loop_start:
    // Code
loop2_start:
    // Code
    if(<condition>) goto loop_start
    // Code
    if(<condition>) goto loop2_start // Switched the gotos

请注意,我在 goto 上切换了位置,所以这个“循环”没有正确嵌套。 没有内循环和外循环。 这就是所谓的意大利面条代码,而goto不受欢迎的原因,因为它使代码很难遵循。 但它何时是编译器编写的程序集并不重要。

那么这个片段是否算作一个循环,虽然是一个复杂的循环? TBH,我不确定。 但我所知道的是,递归和常规迭代具有同样的表现力,这意味着没有什么可以递归计算,也不能迭代计算,反之亦然 阅读 此处了解更多信息。

有些东西用递归的方式写起来要容易得多。 例如,Ackermann function: How to rewrite Ackermann function in non-recursive style?

您可以使用递归 - 没有循环。

void printarray1(int *array, size_t size, size_t pos)
{
    if(pos < size) {printarray1(array, size, pos + 1); printf("%d%s", array[size - pos - 1], pos ? " ": "");}
}

void printarray(int *array, size_t size)
{
    printf("[");printarray1(array, size, 0);printf("]");
}

int main(void)
{
    int array[] = {1,2,3,4,5,6,7,8,9,10};

    printarray(array, sizeof(array)/sizeof(array[0]));
}

https://godbolt.org/z/Y79xTG

是的,我们可以。 如果数组大小是固定的,例如如果数组的大小是 6。那么您可以将 printf(a[0]) 等值打印到 printf(a[5])。 如果您将 ''n'' 值(这里 n 是数组的大小)作为输入给用户,那么您不知道用户会给出什么值。 因此,在这种情况下,您需要循环打印数组中的值。

如果它是一个字符数组,这样:

char a[] = "abcdefghi";
printf("%.3s", a); // prints -> abc

如果你想打印可变数量的字符:

char a[] = "abcdefghi";
char fmt[128];
int n = 3;
sprintf(fmt, "%%.%ds", n);
printf(fmt, a); // prints -> abc

对 arrays 个不以 \0 结尾的字符有用

是的,可以在没有循环的情况下打印数组,您只需使用 goto statemenet 进行循环并检查 if 条件

    my:

   if(i<n)
   {
    scanf("%d",&arr[i]);
    i++;
    goto my;
}
else{
    printf(" ");
}
j=0;
to:
    
if(j<n)
{
    printf("%d ",arr[j]);
    j++;
    goto to;
}
else{
    printf(" ");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM