c - 我们如何在不使用循环和条件的情况下打印从 1 到 100 的数字

标签 c

<分区>

基本上我在互联网上发现的问题是:“我们如何在不使用循环和条件的情况下打印从 1 到 100 的数字?”在答案中,我卡在了下面标有粗体的几行。谁能给我解释一下那是什么? 据我所知,我认为下面的全部代码都是用 C 语言编写的。

#include <stdio.h>
#include <stdlib.h>

void foo(int);

void f1(int x)
{
  printf ("%d\n", x + 1);
  foo (x + 1);
}

void f2(int x)  //why we have used this fumction
{}

void (*tab[])(int) = { f1, f2 }; // what is this

void foo(int x)
{
  tab[!(x < 100)](x); // what is this
}

int main()
{
  foo(0);
  return 0;
}

最佳答案

tab是两个函数指针的数组。

因为您不允许使用 if ,而是使用函数数组,并使用 !(x < 100) 的结果对它们进行索引比较。如果为真,它的计算结果为 1 , 所以你调用 tab[1] 中的函数,即 f2() .当它为假时,它的计算结果为 0 , 所以你调用 tab[0] ,即 f1 .所以它实际上与:

if (x < 100) {
    f1(x);
} else {
    f2(x);
}

f1(x)版画 x+1然后调用 foo(x+1)递归地。 f2(x)什么都不做,所以当你到达这里时递归结束。

关于c - 我们如何在不使用循环和条件的情况下打印从 1 到 100 的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546878/

相关文章:

c - 兄弟子进程之间的管道份额

c - 为什么调用 execvp 时此 free 会失败?

python - 如何在 C 扩展中创建自定义 Python 异常类型?

c - 在 for 循环中增加内部计数器变量

c++ - 非阻塞套接字上的 select()、recv() 和 EWOULDBLOCK

c - linux kernel tty driver 你能在代码中默认关闭echo吗?

c - 编译-std=c90时,如何启用CYGWIN中<time.h>中的clock_gettime()声明?

c++ - 我可以在 DLL 中混合使用 __cdecl 导出调用和 __stdcall 导入调用吗?

c - 为什么 strcpy 将垃圾字符附加到一小部分字符串的末尾?

c - 以有效的方式找到最大值和最小值