我遇到了一个问题,即查看代码应该在c:
中输入的if语句void getInput(void)
{
static size_t _read = 0;
memset(line, 0, _read);
do{
memset(line, 0, _read);
write(STDOUT_FILENO, ">> ", 3);
_read = read(STDIN_FILENO, line, MAXLINE - 1);
if (line[0] == '\n' || line[0] == '\r')
continue;
}while(line[_read - 1] != '\n');
line[_read] = '\0';
}
问题在于行“if(line [0] =='\ n'|| line [0] =='\ r')”这里是调试器的摘录。
getInput () at main.c:29
29 if (line[0] == '\n' || line[0] == '\r')
1: line[0] = 10 '\n'
(gdb) step
31 }while(line[_read - 1] != '\n');
1: line[0] = 10 '\n'
(gdb) list 29
24 memset(line, 0, _read);
25 do{
26 memset(line, 0, _read);
27 write(STDOUT_FILENO, ">> ", 3);
28 _read = read(STDIN_FILENO, line, MAXLINE - 1);
29 if (line[0] == '\n' || line[0] == '\r')
30 continue;
31 }while(line[_read - 1] != '\n');
32 line[_read] = '\0';
33 }
正如您所看到的那样,它不会转到continue语句,而是直接转到while语句。我确实认为继续会转到while语句,但我仍然不明白为什么它不会先继续继续。
由于
答案 0 :(得分:1)
如果您在启用优化的情况下进行编译,if
的跳转指令完全可能直接转到while
,而不是打扰continue
,只是另一个简单的跳转指令。
答案 1 :(得分:0)
继续会带你去声明。这可能是由于编译器的优化。它检测到继续之后没有语句,因此无论if条件是否为真,结果步骤都是相同的。
答案 2 :(得分:0)
你的if是多余的。这是循环中的最后一件事,它所做的就是继续循环。如果您使用任何优化,它可能会被删除。
你的代码应该做什么?
答案 3 :(得分:0)
调试器执行语句。
有问题的行没有完整的陈述;调试器永远不会在语句中间停止。
想象一下,你有如下所示的多行语句。调试器会停在哪里?
for (
i = 0;
i < 100;
i++)
sum += a[i];