【问题标题】:Using #include <stdbool.h> in C在 C 中使用 #include <stdbool.h>
【发布时间】:2019-03-19 10:09:00
【问题描述】:

我不知道为什么会这样。有没有人遇到过这个?我使用的是 Netbeans 8.2,程序在调试模式下运行。

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

#define N 100

int main() {
    //all lockers are closed
    bool lockers[N + 1] = {false};

    return 0;
} 

正如您所看到的,Netbeans 说某些索引包含看似 int 值的内容,当我将所有值声明为 false 时,突出显示的索引甚至为 true。

【问题讨论】:

  • 请不要仅在图像中提供代码。将其包含在问题中。并尽可能避免使用调试器映像。
  • 当调试器显示虚假值时,当前行是哪一行?可能是在执行初始化之前所以内容不确定吗?在到达return 0; 之前,lockers 中的值并不是真正确定的。
  • 另外,请向我们展示完整的代码,而不是其中的一部分。 N 是什么?为什么会有numberOfStudents
  • 嗯,没错。程序没有完成将每个元素的值设置为 false,因为它还没有达到 return 0;
  • 也许您只是在bool lockers[N + 1]= {false}; 行甚至还没有执行之前在调试器中查看值...无论如何,没有人能够根据给出的信息重现问题。

标签: c arrays debugging netbeans boolean


【解决方案1】:

布尔值是一种算术类型,因此,当您未在初始化程序中提供显式值时,应将其初始化为静态变量。

这在(例如)C11 6.7.9 Initialization 中有详细说明(转述):

21/ 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,则聚合的剩余部分应为 隐式初始化与具有静态存储持续时间的对象相同。

10/ 如果具有静态或线程存储持续时间的对象未显式初始化,并且它具有算术类型,则将其初始化为(正数或无符号)零。

正确检查方面,对您的代码进行如下临时更改:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 100

int main() {
    //all lockers are closed
    bool lockers[N + 1]= {false};

    for (int i = 0; i <= N; ++i)
        if (lockers[i])
            printf("%d is the wrong value\n", i);

    return 0;
}

不应该得到任何输出,如果是这样的话,要么是 NetBeans 调试器错误,要么是你使用错误:-)

【讨论】:

  • 如果是这种情况,要么是 NetBeans 调试器错误,要么是您使用错误 这里有点晚了,但第三种可能性是初始化已优化,因为原始代码中的lockers 数组从未被访问过。
  • @Andrew,这 一个好点,至少对于原始代码而言,因为很可能正在遵循“好像”规则并且编译器已经计算出没用过。
猜你喜欢
  • 2010-09-06
  • 2010-09-23
  • 2012-04-30
  • 2017-04-28
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2018-12-21
相关资源
最近更新 更多