【问题标题】:Change elements of a boolean array to false in C [closed]在C中将布尔数组的元素更改为false [关闭]
【发布时间】:2018-08-14 13:57:05
【问题描述】:

我正在做一个 Project Euler 挑战,以找出一个数的所有质因数。我正在使用一个初始化为 true 的布尔数组,然后通过将 bool 值更改为 false 来“划掉”倍数。 (这是 Eratosthenes 的筛子)但我不知道如何将元素保存为 false。我可以让它列出非素数(或“假”数),但是当我尝试打印出素数或“真”数时,它会打印每个数字。如果有人能告诉我我做错了什么,我将不胜感激。

我的代码:

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


void hope(int n, bool Ar[n])
{
    for (int i = 2; i <= n; ++i)
    {
        if (Ar[i] = (true))
        {
            for (int j = i*i; j<=n; j = i+j)
            {
                Ar[j] = false;
            }
        }
    }
    for (int i = 2; i <= n; ++i)
    {
        if (Ar[i] = (true))
        {
            printf("\ntrue value: %d", i);
        }
    }

}
int main ()
{
    int n = 15;
    bool Ar[15] = {true};
    hope(n, Ar);

    return 0;
}

【问题讨论】:

  • = 用于分配。 == 用于相等比较。
  • if (Ar[i] = (true)) --> if (Ar[i] == (true)) 或更好:if (Ar[i])
  • 另外,bool Ar[15] = {true} 只初始化数组的第一个成员。
  • 哦,真的等一下吗?非常感谢!
  • 您是否打开了警告? if (Ar[i] = (true)) ... 应该给你一个警告。

标签: c boolean


【解决方案1】:

您正在分配 ( = ) 值,而不是比较 ( == ) 它。改成

if (Ar[i] == (true))
.
.

此外,还有一个名为 Yoda conditions 的东西正是针对此类错误。看看

【讨论】:

    【解决方案2】:

    两个主要问题:

    1. 正如其他所说,条件错误(实际上它为数组元素分配了 true 并且条件始终为 true。

    2. for (int i = 2; i &lt;= n; ++i)Ar[i] - 未定义的行为,因为数组是从 0 而不是 one 索引的,并且您在此处具有越界访问权限。必须是for (int i = 1; i &lt; n; ++i)

    后面几行相同for (int j = i*i; **j&lt;=n**; j = i+j)

    再次for (int i = 2; **i &lt;= n**; ++i)

    【讨论】:

    • 很好发现的数组边界问题。然而,与其使用i &lt; n 重新编码而不是使用prime-test n,不如使用bool Ar[15 + 1] 等更大的数组。
    【解决方案3】:

    第一期:

    bool Ar[15] = {true};
    

    只将数组中的第一个元素初始化为true;其余元素将初始化为false。但是,您打印每个数字的原因是

    if (Ar[i] = (true))
    

    分配 trueAr[i],而不是执行比较。您需要将其更改为

    if ( Ar[i] == true ) 
    

    或者,甚至更好:

    if ( Ar[i] )
    

    【讨论】:

      【解决方案4】:

      有多个问题:

      1. for (int i = 2; i &lt;= n; ++i):由于数组越界问题,这将调用未定义的行为。必须是for (int i = 1; i &lt; n; ++i)
      2. if (Ar[i] = (true)),这将始终评估为 true,并将分配 Ar[i]true。养成使用if (true == Ar[i]) 而不是if (Ar[i] == (true)) 的习惯,这样编译器就会抱怨在if 条件中意外使用了=
      3. bool Ar[15] = {true} 仅初始化数组的第一个成员,有多种初始化数组的方法 :-) 只需浏览 stackoverflow 或向下滚动即可。

      有一个改进,请使用以下内容代替您的main

      #define COUNT_OF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
      
      int main ()
      {
          //int n = 15;
          bool Ar[15] = { [0 ... COUNT_OF(Ar)-1] = true};
          hope(COUNT_OF(Ar), Ar);
      
          return 0;
      }
      

      这将帮助您根据您的要求更改数组大小,并且无需在很多地方进行相同的更改即可离开 :-) 虽然,使用它可能并不完全符合书本。请注意,它们不是纯粹的 gcc 扩展,但使用 ... 肯定是 gcc 扩展。

      【讨论】:

      • 1) bool Ar[15] = { [0 ... sizeof Ar] = true}; 索引出Ar[15]。也许你的意思是[0 ... COUNT_OF(Ar)-1]? 2)Using Range in Designated Initializers 似乎是非标准 C。
      • @chux:啊,是的。感谢您指出这一点:-)
      猜你喜欢
      • 2015-02-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多