gpt4 book ai didi

在不使用 c99 标准的情况下使用 bool 编译 c 代码

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:42 24 4
gpt4 key购买 nike

我尝试在 C 中使用 bool 变量编译代码,并且包含了 stdbool header ,但是当我编译它时,我没有指定我想用 c99 标准编译它(所以它被编译了使用 ANSI C 标准),但它仍然有效。我想知道为什么会这样?这是代码:

#include <stdio.h>
#include <stdbool.h>

int main() {
char name[20];
printf("What's your name ? ");
gets(name);
printf("Nice to meet you %s.\n", name);
bool exit = false;
char c;
printf("Do you wish to exit the program ? (Y/N) ");
while (!exit) {
c = getchar();
if (c == '\n') {
continue;
}
printf("Do you wish to exit the program ? (Y/N) ");
if (c == 'Y' || c == 'y') {
exit = true;
}
}
printf("Have a nice day %s\n", name);
return 0;
}

还有另一个关于我的代码的问题。在询问您是否要退出程序的部分,我已经使用以下输入对其进行了测试:nny

出于某种原因,它第四次将问题打印到控制台,但我不明白为什么。我已经设置了它,所以如果输入是 Y/y,则 while 循环中的下一次迭代不应该发生,但由于某种原因它再次打印它,有人可以解释我做错了什么吗?

编辑:因此,我对代码进行了一些编辑,试图测试新事物,并且我注意到使用以下代码,如果用户输入是 Y/y,它不会跳出循环:

#include <stdio.h>
#include <stdbool.h>

int main(int argc, char* argv[]) {
for(int i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
char name[20];
printf("What's your name ? ");
gets(name);
char lastname[20];
printf("%s what's your last name ? ", name);
fgets(lastname, 20, stdin);
int age;
printf("%s %s what's your age? ", name, lastname);
scanf("%d", &age);
bool exit = false;
char c;
while (!exit) {
printf("Do you wish to exit the program ? (Y/N) ");
c = getchar();
getchar();
if (c == 'Y' || c == 'y')
exit = true;
}
printf("Have a nice day %s %s.\n", name, lastname);
return 0;
}

我不知道我为什么这样做,但我在 while 循环之前添加了一个 getchar() 调用并尝试以这种方式编译它然后程序运行良好,据此我假设 fgets\scanf 函数干扰了getchar 函数,但我不确定为什么有人可以解释一下?

最佳答案

大多数 C 编译器通过扩展来扩展基础语言。一个这样的扩展可能是让 stdbool.h 即使在 C90 模式下也能工作。如果你真的想要,你通常可以用一些编译器标志关闭大部分扩展,例如对于 gcc 使用 -std=c90。不确定额外的 header ,毕竟文件仍然存在,因此无论模式如何,它都可能被包含在内。

对于你的第二个问题,尝试单步执行程序,在每一步打印 c 的值。它应该使正在发生的事情变得相当明显。

关于在不使用 c99 标准的情况下使用 bool 编译 c 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25534544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com