0

我是一名新的 C 程序员,我正在为家庭作业编写一些数据结构。我在这里有两个问题。

  1. 我们看到很多 C 函数指针的例子,通常用于节省代码重复。我弄乱了这个函数,我最初写的是:

(我们预定义的常量。缩进也关闭了)。

    static PlayerResult playerCheckArguments(const char* name, int age,
    int attack, int defense) {
    PlayerResult result = PLAYER_SUCCESS;
    if (!name) {
    result =  PLAYER_NULL_ARGUMENT;
    } else if (strlen(name) > PLAYER_MAX_NAME_LENGTH) {
    result =  PLAYER_NAME_TOO_LONG;
    } else if (invalidAge(age)) {
    result = PLAYER_INVALID_AGE;
    } else if (invalidAttack(attack)) {
    result = PLAYER_INVALID_ATTACK;
    } else if (invalidDefense(defense)) {
    result =  PLAYER_INVALID_DEFENSE;
    }
    return result;
}

直到我得到这个食尸鬼:

    static PlayerResult playerCheckArguments(const char* name, int age, int attack,
    int defense) {
void* arguments[PLAYER_NUM_OF_PAREMETERS] = { name, &age, &attack, &defense };
PlayerResult (*funcArray[PLAYER_NUM_OF_PAREMETERS])(
        int) = {&invalidName, &invalidAge, &invalidAttack, &invalidDefense };
PlayerResult result = PLAYER_SUCCESS;
for (int i = 0;
        i < PLAYER_NUM_OF_PAREMETERS && result == PLAYER_SUCCESS; i++) {
    PlayerResult (*func)(int) = funcArray[i];
    void* key = arguments[i];
    result = func(key);
}
return result;

我的第一个问题是 - 有什么理由我应该使用/编写第二个函数而不是另一个函数,并且通常尝试使用明显降低代码的清晰度和/或简单性的这种“复杂性”?

现在,对于我的第二个问题:您可能已经注意到,我使用了很多局部变量来简化调试。这样,我可以查看所有相关评估并在程序运行时有效地监控程序。除了使用局部变量之外,还有其他方法可以显示函数中的表达式吗?

非常感谢!

返回 0 ;-)

4

2 回答 2

0

由于您的问题被标记为编码风格,我只想说,第一个绝对是首选。原因很简单。向 200 个程序员展示这两个函数,100 个看到第一个,100 个看到第二个,然后记录程序员能够描述该函数的功能所花费的平均时间。你绝对会发现,平均超过数百名程序员,每次都是第一个获胜。

因此,如果您可能要检查 20 多个不同的参数,那么您只会做第二个,即使这样,也有更简洁的方法可以做到这一点。我不相信你会看到第二个的速度有任何提高。

于 2013-11-05T00:24:21.237 回答
0

清晰远比聪明重要。越难弄清楚越难正确,当你不正确时进行调试。

为了清晰或调试而使用局部变量并没有错。有一个 ole saw 上面写着“避免过早优化的罪过”。使您的代码尽可能简单明了。如果您发现这不足以增加完成工作所需的复杂性。

于 2013-11-05T00:25:08.867 回答