Простой оператор if в C всегда возвращает true - PullRequest
0 голосов
/ 21 мая 2019

У меня нет времени, чтобы объяснить это глубоко, очень простой код, но функция всегда возвращает '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 ]

2 голосов
/ 21 мая 2019

Когда вы объявляете int a внутри main как

int a=rand()%512;

вы скрываете глобальную переменную a. a в main - это другая переменная, имеющая область видимости только локальную для функции main. Поэтому, когда вы используете значение a внутри char abcd(char c), это значение представляет собой глобальную переменную a, которая по умолчанию имеет значение 0.

Кроме того, почему вы передаете переменную char c в функцию abcd. Вы не используете это. Пожалуйста, подумайте о переименовании ваших функций во что-то, что более четко описывает их назначение.

0 голосов
/ 21 мая 2019

У вас есть две разные переменные 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);
}
0 голосов
/ 21 мая 2019

Ваша причина не работает, потому что переменная a была объявлена ​​в отдельной области видимости от функции abcd. Переменная, которую вы используете внутри функции abcd, автоматически устанавливается на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...