【发布时间】:2018-12-27 21:29:17
【问题描述】:
我正在使用布尔数组来检查字符出现检查程序是否已看到 Char。
我的问题是:数组布尔值如何/为什么/可以将 Char 条目与真或假相关联?
for (i = 0; i < len; i++) {
char c = text[i];
if (seen[c]==true) {
continue;
}
seen[c]=true;
下面是包含有问题的“布尔”的代码 sn-p。注意这里使用 bool 有效,想知道为什么/如何。
char* text = lower_case_all();
bool seen[256];
int i;
char c;
for (i = 0; i < 256; i++) {
seen[i]=false;
}
int len = strlen(text);
for (i = 0; i < len; i++) {
char c = text[i];
if (seen[c]==true) {
continue;
}
seen[c]=true;
int occs = compute_occ(c, text);
if (occs>0) {
printf("%c : %d : ",c, occs );
}
}
【问题讨论】:
-
c用作标志数组的索引,指示在先前的处理中是否曾见过c的值。这将调用compute_occ限制为每次出现c的任何给定值时仅调用一次。将char等同于bool与该算法没有任何关系 (顺便说一下,如果您在c和@987654332 中获得不在0x00..0x7F中的值,则该算法会出现未定义的行为@ 是在你的平台上签名的,就像在大多数平台上一样)。 -
旁白:
bool seen[256]; .... if (seen[c]==true) {是 WET。考虑编码if (seen[c]) {。它可能有助于使代码更清晰。 -
使用
char c,c用作数组seen[]的索引。不幸的是,c可能是负数,然后seen[c]是未定义的行为 (UB)。 -
令我困惑的是:“我正在使用布尔数组来检查字符出现检查程序是否已经看到了一个字符。” - 如果 你写了这个,你怎么能不理解和回答你自己的问题?你肯定知道为什么要以这种方式编写代码,对吧?