2014-09-03 97 views
1

我的教授发布差异返回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在奇数中返回!甚至在!我不确定为什么,因为我不知道返回1和返回0命令之间的区别。从我能收集的内容中返回1将始终返回值(在本例中为奇数!),但返回0只会在它满足特定条件时才返回它?

另请参见:代码int length(char * name,int start,double finish):以字符作为实数返回单词的长度?

在此先感谢任何决定帮助我的人。

+1

我已修复您的代码indendantion。您必须使用4个字符间距缩进代码,或者选择所有代码,然后单击“代码示例”按钮。 – pablo1977 2014-09-03 03:46:27

+0

感谢您的帮助! – NewCsStudent432 2014-09-03 03:47:07

+2

@ pablo1977你称之为修复? – 2014-09-03 03:47:11

回答

3

这被称为“Short-circuit evaluation”。

...在第二个参数被执行或评估仅在第一个参数不足以确定表达式的值...

因此,你必须弄清楚什么将这两个函数oddeven返回:

  1. 奇数():如果n%2 == 1,返回1,否则返回0
  2. 甚至():如果n%2 == 0,返回1,否则为0

而在main()函数,

  1. odd(3)ANDodd(3)返回1,并检查返回值,因此even()被调用。
  2. odd(3)ORodd(3)返回1,因为“短路求”的,它并不需要检查,因此even()不叫。
  3. odd(4)even(7)odd(4)返回0,因为“短路求”的,它并不需要检查even(7),因此even()不叫。
  4. odd(4)OReven(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

逻辑布尔代数运算符AND和OR(&&|| c)中与操作一种称为short-circuit evaluation的优化。

这是优化的工作原理。

试想一下,你想出了自己的规则:

,如果他们拥有cat和A dog和A fish你只会某人约会。

现在想象一下,你开始跟某个你可能有兴趣约会的人谈话。他们说:

那么,我有一只猫,我没有一条鱼,但我确实有一条狗。

你什么时候停止关注他们说的话?只要他们说他们没有fish,因为一旦他们说,他们打破了你的“AND”规则。所以,这句话的其余部分完全不相关。这是短路和。

现在,假设你改变了你的规则:

你只能约会的人,如果他们拥有一个catdogfish

现在想象一下,你开始跟某个你可能有兴趣约会的人谈话。他们说:

嗯,我没有一只猫,我有一条鱼,我没有一只狗。

你什么时候停止关注他们说的话?只要他们说他们有一个fish,因为他们一说,他们满足你的“OR”规则。所以,这句话的其余部分完全不相关。这是短路或。

短路评估是评估逻辑表达式的性能优化。

在您的例子中,even()函数返回true如果传递给它的数量是偶数,并且odd()函数返回true如果传递给它的数量是偶数。否则这些功能返回false。查看每个布尔表达式,并注意何时必须进行短路评估。

1

返回0; - 函数返回0. 返回1; - 函数返回1.

在你的情况下,奇数函数在number(n)是奇数时返回1,当number是偶数时返回0。 这是通过“询问”如果提醒时除以2等分1来完成的。

甚至函数在数字(r)是偶数时返回1,当数字是奇数时偶数函数返回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来提供有关这种错误的详细信息。