简单的if语句始终返回true

时间:2019-05-21 20:21:16

标签: c

我没有时间深入解释它,它的代码很简单,但是函数总是返回'y'(= true) 期望将每个数字从1写入生成的随机数的平方根,并确定它是否可除,但是当我运行它时,函数中的if语句总会返回true

#include <stdio.h>
#include <stdlib.h>
int a,b,i;
char c;
char abcd(char c);
int main()
{
srand(time(NULL));
int a=rand()%512;
 b=sqrt(a);
 i=1;
 do{
    if(abcd(c)=='y')printf("number %d is dividable by %d\n",a,i);
    else printf("number %d is not dividable by %d\n",a,i);
    i++;
}while(i<=b);

return 0;
}
char abcd(char c)
{

    if(a%i==0)return'y';
    else return 'n';

}

3 个答案:

答案 0 :(得分:2)

int a中将main声明为

int a=rand()%512;

您正在隐藏全局变量a。 main中的a是另一个变量,其作用域仅在函数main本地。因此,当您在a中使用值char abcd(char c)时,该值是全局变量a,即default initialized to 0.

此外,为什么还要将char c变量传递给函数abcd。您没有使用它。请考虑将您的功能重命名为更清楚地描述其意图的内容。

答案 1 :(得分:0)

您不起作用的原因是因为变量a在与abcd函数不同的作用域中声明。您在abcd函数中使用的a变量会自动设置为0,这就是为什么它每次都返回true的原因(0%的值等于0)。  调用abcd时,您需要在内部传递参数以使其使用正确的值。

但是实际上您不需要abcd函数,您可以节省很多代码并直接检查它是否可整除。该代码应该可以工作:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int a, b, i;
char c;
int main()
{
    srand(time(NULL));
    int a = rand() % 512;
    b = sqrt(a);
    i = 1;
    do {
        if (a%i == 0)printf("number %d is dividable by %d\n", a, i);
        else printf("number %d is not dividable by %d\n", a, i);
        i++;
    } while (i <= b);

    return 0;
}

答案 2 :(得分:0)

您有两个不同的变量a

  • 在文件范围内声明了一个

    int a,b,i;
    
  • 和在main()中声明的一个:

    int a=rand()%512;
    

在它的范围内(main()的几乎所有部分),后者遮盖了前者。在其他地方,例如在功能abcd()中,只有前者可见。前者默认初始化为0,并且没有其他任何赋值,因此无论i取什么值,在abcd()中,表达式a%i的取值为0。

这是避免文件作用域变量的一个很好的教训。函数应该对通过参数直接或间接访问的数据或从外部源获取的数据进行操作。函数通过文件范围变量交换数据的形式很差。此外,对我来说,您的函数abcd()声明了一个从未使用过的参数,这对我来说是一个危险的信号。建议的变体:

char abcd(int dividend, int divisor) {
    return (dividend % divisor) ? 'n' : 'y';
}

甚至更好(因为更好的名称和更合适的返回类型):

_Bool is_divisible(int dividend, int divisor) {
    return !(dividend % divisor);
}