在C中将布尔数组的元素更改为false

时间:2018-08-14 13:57:05

标签: c boolean

我正在研究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;
}

4 个答案:

答案 0 :(得分:3)

您要分配(=)值,而不是对其进行比较(==)。将其更改为

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

同样,对于这类错误,有一个称为Yoda conditions的东西。看看

答案 1 :(得分:2)

两个主要问题:

  1. 如其他陈述所述,条件是错误的(实际上,它为数组元素分配了true,而条件始终为true。

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

稍后几行for (int j = i*i; **j<=n**; j = i+j)

,然后再次for (int i = 2; **i <= n**; ++i)

答案 2 :(得分:1)

第一期:

bool Ar[15] = {true};

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

if (Ar[i] = (true))

true分配给Ar[i],而不是进行比较。您需要将其更改为

if ( Ar[i] == true ) 

或者甚至更好:

if ( Ar[i] )

答案 3 :(得分:0)

有多个问题:

  1. for (int i = 2; i <= n; ++i):由于数组越界问题,这将调用未定义的行为。它必须是for (int i = 1; i < 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扩展名。