Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中是否可以不使用任何循环来打印数组?_C_Loops - Fatal编程技术网

在C语言中是否可以不使用任何循环来打印数组?

在C语言中是否可以不使用任何循环来打印数组?,c,loops,C,Loops,例如,在Python中,如果我们将一个列表作为一个数组,那么它将直接为一行代码打印整个数组。有没有办法用C语言实现同样的目标?简短回答 没有 对表格中几乎所有问题的简短回答“你能像Python一样简单地用C做X吗?” 没有 长话短说 这取决于你的意思。在内部,Python也使用循环。它只是对您隐藏,所有编程语言也是如此。如果要处理数组,通常需要在某个级别进行循环 因此,如果您的问题是是否有一些用于打印数组的预定义函数,那么答案是否定的,前提是数组不是字符串。但是为它编写自定义打印函数并不困难。下

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

简短回答 没有

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

长话短说 这取决于你的意思。在内部,Python也使用循环。它只是对您隐藏,所有编程语言也是如此。如果要处理数组,通常需要在某个级别进行循环

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

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]);
    }
}
但正如我所说,这基本上只是一个伪装的循环。至少在这个简单的例子中。在程序集中,所有循环通常都转换为类似以下内容:

loop_start:
    // Code

    if(<condition>) goto loop_start
loop\u启动:
//代码
if()转到循环\u开始
或使用嵌套循环:

loop_start:
    // Code
loop2_start:
    // Code
    if(<condition>) goto loop2_start
    // Code
    if(<condition>) goto loop_start
loop\u启动:
//代码
循环2_开始:
//代码
if()转到loop2\u启动
//代码
if()转到循环\u开始
使用递归,这些跳跃会变得更加复杂。如果使用复杂的递归,跳转可能会停止正确嵌套。它可能会导致如下情况:

loop_start:
    // Code
loop2_start:
    // Code
    if(<condition>) goto loop_start
    // Code
    if(<condition>) goto loop2_start // Switched the gotos
loop\u启动:
//代码
循环2_开始:
//代码
if()转到循环\u开始
//代码
if()转到loop2\u start//切换了转到
注意,我在gotos上切换了place,所以这个“循环”没有正确嵌套。没有内环和外环。这就是所谓的意大利面代码,人们不赞成它的原因是它使代码很难遵循。但编译器何时编写程序集并不重要

那么这段代码算不算是一个循环,尽管它很复杂?TBH,我不确定。但我知道的是,递归和正则迭代同样具有表现力,这意味着没有什么东西是可以递归计算的,而不能迭代计算,反之亦然。阅读了解更多信息

有些东西用递归风格编写起来容易多了。例如,Ackermann函数:

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

您可以使用递归-无循环

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]));
}
void printarray1(int*数组、大小、位置)
{
if(pos

不太可能。只要使用for循环和printfYes,如果您使用一些递归终端尾部调用进行“循环”,并且如果您的编译器(例如…)足够好,可以对其进行优化,那么就可以使用for循环和printfYes,如果您计算例如
put(“hello”)
(或者使用显式声明的
char[]
)的话……@BasileStarynkevitch。。。但是如果你的编译器足够好去优化它,它就是在把它优化回一个循环中(除非长度是短的、恒定的,并且它只是被展开)。是的。问题是什么是循环:一些语法的东西(在C:with
for
while
do
…)或者一些语义的东西(任何具有恒定高度调用堆栈的迭代)。我无法决定我是否喜欢这个答案,因为这显然不是OP的意思。不过,还是有很好的捕捉能力,对细节有很好的观察力。投赞成票!:)实际上,您的无循环解决方案也适用于数量可变的
n
。您只需在每个
printf
语句前面添加
if
语句。然而,循环当然是更简单的解决方案。这太糟糕了!:D
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]));
}