c - 修改函数而不失去意义

标签 c loops if-statement function-definition fizzbuzz

编辑:我认为我需要更精确,代码本身很好,但我需要修改它,使其不具有超过 3 个分支的 block 。例如,可以通过执行多个功能来分离它

我正在尝试做 Fizzbuzz ,我的代码是正确的,但问题是我在条件 block 中不能有超过三个分支,这是我到目前为止所做的:

#include <stdio.h>
#include <unistd.h>

void fizzbuzz(int number_one, int number_two)
{
    for (int nbr = number_one; nbr <= number_two; nbr++) {
        if (nbr % 15 == 0)
            printf("Fizzbuzz\n");
        else if (nbr % 5 == 0)
            printf("Buzz\n");
        else if (nbr % 3 == 0)
            printf("Fizz\n");
        else
            printf("%i\n", nbr);
    }
}

int main(int ac, char **av)
{
    if (ac == 1)
        return 84;
     if (ac == 3) {
        int number_one = atoi(av[1]);
        int number_two = atoi(av[2]);
        if (number_one > number_two) {
            printf("Error: the second parameter must");
            printf("be greater than the first one.\n");
            return 84;
        } else
            fizzbuzz(number_one, number_two);
    }
    return 0;
}

最佳答案

我发布这段看起来很邪恶的代码只是为了说明人为要求和“不成熟”优化的问题。免责声明:不要编写这样的代码。

#include <stdbool.h>
#include <stdint.h>

static void fizzbuzz (uint_fast16_t start, uint_fast16_t end)
{
  for(uint_fast16_t i=start; i<=end; i++)
  {             //012345678  
    char str[] = "FizzBuzz\0";
    char* strp = str;
    bool div3 = (i % 3)==0;
    bool div5 = (i % 5)==0;

    strp[(9 - 5*div3)] = '\0';
    strp[(9 - 5*(div3 & div5))] = 'b';
    strp += 4 * div5 * !div3;
    str[0] *= div3 | div5;

    char fmt[] = "%d";
    fmt[0] -= div3 | div5;
    fmt[0] *= !div3 * !div5;
    printf(fmt, i);
    puts(strp);
  }
}

除了循环条件外,C 代码中还包含零个分支。但在生成的机器代码中仍然不少。它比你现有的更有效率吗?我有点怀疑。乍一看,机器代码的效率可能会稍微高一些。以牺牲可读性为代价。

值得注意的是,这段代码中的巨大瓶颈不是可见的或生成的分支,而是 printf 调用。因此,在保持用户输出和算法混合的情况下进行这样的过早优化是毫无意义的。根据目标的不同,分支可能会也可能根本不会成为问题。中低端 CPU 没有分支预测或指令缓存。

一些经验教训:

  • 始终质疑规范是否有意义。上面的代码完美地满足了您的规范“不超过 3 个分支”,但阅读和维护起来却很糟糕。而且也不一定快得多。
  • 专注于编写尽可能可读的代码。
  • 仅在考虑到特定系统且代码中存在已知瓶颈时才进行手动优化。
  • 不要混合用户界面和算法,将它们分开。

关于c - 修改函数而不失去意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75159209/

相关文章:

Promise循环中的javascript sleep 函数

java - 无法让数组更改为正确的大小

php - 多个 foreach 与多个 if inside foreach

检查文件是否存在,包括在 PATH 中

python - 用列表中的值替换 Pandas 数据框中的索引值

c++ - 用 C 折扣库解析 markdown

php - 如果 || 我的代码不能正常工作

javascript - 为什么这个脚本永远不会运行?

c - 结构困惑 (2)

c++ - 非常大的数组——C 数组与 C++ 数组。 Visual Studio - 超过最大值 (268435456)