【问题标题】:Continue acting weird?继续装怪?
【发布时间】:2018-06-20 18:39:35
【问题描述】:

我遇到了这个代码:

int main() {
    int fd[2];
    pipe(fd);
    int pid;

    if ((pid = fork()) < 0) {
        sysCallFailureProcedure();
    }

    if (pid == SON_PROCESS) {

        dup2(fd[0], 0);
        execlp(TETRIS_DISP_NAME, TETRIS_DISP_NAME, NULL);

        sysCallFailureProcedure();
    }

    char c;
    enum Bool hasNotQuitted;
    while (hasNotQuitted) {
        c = getch();
        if (!isAlegalKey(c)) {
            continue;
        }
        if(write(fd[1], &c, 1) < 0) {
            sysCallFailureProcedure();
        }
        kill(pid, SIGUSR2);

        if (c == QUIT_KEY) {
            hasNotQuitted = false;
        }
    }

    return OPERATION_SUCCEEDED;
}

我正在尝试改进它并丢失 continue 语句(这是一种不好的做法)。但当我这样做时, 它导致我的程序无法正常运行,它是某种俄罗斯方块游戏的运行程序。我所做的只是将 continue 替换为:

if(write(fd[1], &c, 1) < 0) {
    sysCallFailureProcedure();
}
kill(pid, SIGUSR2);

if (c == QUIT_KEY) {
    hasNotQuitted = false;
}

意思是跟在 continue 后面的代码。 谁能告诉我我错过了什么?

【问题讨论】:

  • 谁告诉你continue 是不好的做法?它是工具箱中的一个工具,就像该语言的其他功能一样。
  • 你在第一次测试之前不会初始化hasNotQuitted,所以你不知道你的循环是否会退出。
  • 您可以根据需要将其删除,然后将循环的其余部分放入 else{...}?我认为这更具可读性
  • enum Bool hasNotQuitted; - 这确实是一种不好的做法。你有一个标准的bool 类型。
  • 但要回答您的问题,您需要更改if 语句的逻辑。如果isAlegalKey() 为真,continue 之后的所有内容将执行,因此将if (!isAlegalKey(c)) { 更改为if (isAlegalKey(c)) {,您替换continue 的内容将执行。

标签: c operating-system signals


【解决方案1】:

我认为不好的做法不在于“继续”,而在于使用 !isALegalKey 构造。这更具可读性/清晰。

while (hasNotQuitted) {
    c = getch();

    if (isAlegalKey(c)) {
        if(write(fd[1], &c, 1) < 0) {
            sysCallFailureProcedure();
        }
        kill(pid, SIGUSR2);

        if (c == QUIT_KEY) {
            hasNotQuitted = false;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多