2014-09-03 3 views
1

Мой профессор отправилразница между возвращением 0 и вернуться 1

int main(int argc, char **argv) 
{ 
    // enter code here 

    printf("Test 1: trying odd(3) AND even(2)...\n"); 
    printf("%d\n", odd(3) && even(2)); 
    printf("Test 2: trying odd(3) OR even(2)...\n"); 
    printf("%d\n", odd(3) || even(2)); 
    printf("Test 3: trying odd(4) AND even(7)...\n"); 
    printf("%d\n", odd(4) && even(7)); 
    printf("Test 4: trying odd(4) OR even(7)...\n"); 
    printf("%d\n", odd(4) || even(7)); 

    return 0; 
} 

int odd(int n) 
{ 
    printf("in odd!\n"); 

    return n % 2 == 1; 
} 

int even(int r) 
{ 
    printf("in even!\n"); 

    return r % 2 == 0; 
} 

как задание спрашивать, почему линии 2 и 3 возвращают только в нечетные! но 1 и 4 возвращаются нечетно! и даже! Я не уверен, почему, поскольку я не знаю разницы между командами Return 1 и Return 0. Из того, что я могу собрать Return 1 всегда будет возвращать значение (в данном случае в нечетном!), Но возврат 0 вернет его только в том случае, если он удовлетворяет определенному условию?

Также: содержит ли длина кода (char * name, int start, double finish): возвращает длину слова в символах как действительное число?

Заранее благодарим любого, кто решает помочь мне.

+1

Я исправил недействительность вашего кода. Вы должны отступать от кода, используя 4 интервала между символами или хорошо, выбрав весь код, а затем нажмите кнопку «Пример кода». – pablo1977

+0

Спасибо за помощь! – NewCsStudent432

+2

@ pablo1977 вы называете это исправление? –

ответ

3

Это называется «Short-circuit evaluation».

... в котором второй аргумент выполняется, или вычисляется, только если первый аргумент не достаточно, чтобы определить значение выражения ...

Таким образом, вы должны выяснить, что будет эти две функции odd и even возврата:

  1. нечетным(): Если п% 2 == 1, возвращают 1, в противном случае 0
  2. даже(): Если п% 2 == 0, возвращают 1, в противном случае 0

А в главной функции(),

  1. odd(3)И : odd(3) возврата 1, и проверить возвращаемое значение , поэтому even() называется.
  2. odd(3)ИЛИ : odd(3) возврата 1, из-за «оценки короткого замыкания», это не нужно проверить , поэтому even() не вызывается.
  3. odd(4)Иeven(7): odd(4) возвращение 0, из-за «оценки короткого замыкания», не нужно проверять even(7), поэтому even() не называется.
  4. odd(4)ИЛИeven(7): odd(4) возврата 0, и проверить возвращаемое значение even(7), поэтому even() называется.
2

При оценке логических выражений он проверяет условие один за другим и всякий раз, когда все выражение известно (независимо от остальных), оно перестает их оценивать.

Пример

unsigned char a = 1; // true 
unsigned char b = 0; // false 

Случай 1

if (a && b) printf("Yes"); 
  • проверка a: да это true
  • проверка b: нет это не true

Результат: выражение неправильно и не печатает Yes

корпус 2

if (a && !b) printf("Yes"); 
  • проверки a: да это true
  • проверяет b: да это false

Результат: выражение правильно и печатает Yes

ВАРИАНТ 3

if (a || b) printf("Yes"); 
  • проверяет a: да это true
  • проверяет b !!! ЗАЧЕМ? нет необходимости проверять b, так как весь результат выражения известен только путем проверки a, согласны ли вы?

Результат: проверка a и печать Yes, даже не проверяя b

проекта, что ваш код прямо сейчас;)

1

логических операторов булевой алгебры И и ИЛИ (&& и ||) в C работают с оптимизацию, известную как short-circuit evaluation.

Вот как работает оптимизация.

Представьте, что вы придумали правило для себя:

Вы датировать только кто-то, если у них есть cat И в dog И в fish.

Теперь представьте, что вы начинаете говорить с кем-то, что вас может заинтересовать знакомства. Говорят:

Ну, у меня есть кошка, у меня нет рыбы, но у меня есть собака.

Когда вы перестали обращать внимание на то, что они сказали? Как только они сказали, что у них не было fish, потому что, как только они сказали это, они нарушили свое правило «И». Таким образом, остальная часть предложения совершенно не имеет значения. Это короткое замыкание И.

Теперь представьте, что вы изменили свое правило:

Вы только датировать кого-то, если они владеют cat ИЛИ в dog ИЛИ с fish.

Теперь представьте, что вы начинаете говорить с кем-то, что вас может заинтересовать знакомства. Говорят:

Ну, у меня нет кошки, у меня есть рыба, а у меня нет собаки.

Когда вы перестали обращать внимание на то, что они сказали? Как только они сказали, что у них есть fish, потому что, как только они сказали это, они удовлетворили ваше правило «ИЛИ». Таким образом, остальная часть предложения совершенно не имеет значения. Это короткое замыкание ИЛИ.

Оценка короткого замыкания - это оптимизация производительности для оценки логических выражений.

В вашем примере, функция возвращает even()true, если число передается к нему даже и функция возвращает odd()true, если число передается к нему даже. В противном случае эти функции возвращают false. Посмотрите на каждое из булевых выражений и обратите внимание, когда должна произойти оценка короткого замыкания.

1

0 0; - функция возвращает 0. Return 1; - функция возвращает 1.

В вашем случае нечетная функция возвращает 1, когда число (n) нечетно и 0, когда число четное. Это делается путем «запроса», если напоминание при делении на 2 равно 1.

Также функция возвращает 1, когда число (r) равно, и 0, когда число нечетное. Это делается «с просьбой», если напоминание при делении на 2 equels 0.

В главной функции и (& &) и или логические операции выполняются, по результатам возвращаемых значений четных и нечетных функции.

Пример: нечетный (3) возврат 1, ровный (2) возврат 1, затем 1 & & 1 равно 1 (результат).

0

Существует еще один способ проверить четные значения для интегральных типов.

int IsOdd(int x) { return (x & 1); } 
int IsEven(int x) { return !(x & 1); } 

Если установлен младший бит, число нечетное. Если нет, это даже. Это просто проверяет этот бит. Просто выбросьте это, чтобы вы могли исключить работу модуля ... это еще один вариант. Не ответ на ваш вопрос, но я не могу прокомментировать ...

0

Как известно, 0 указывает на ложность, 1 указывает на истинность.А возвращаемая часть сообщает компилятору, что функция должна возвращать оцениваемый результат в модуль вызывающего абонента.

Таким образом, возвращение 1 означает, что сигнал модуля вызывающего абонента об успешном выполнении вызываемого модуля (с помощью величины ненулевой т.е. 1) тогда,

возвращение 0 представляет собой флаг, показывающий, что была некоторая ошибка/аномалия, которая привела к завершению вызываемого модуля. Итак, в этом случае stderr должен использоваться, чтобы сообщить подробности о такой ошибке.

Смежные вопросы