返回0和返回1之间的差异

时间:2014-09-03 03:43:12

标签: c cygwin

我的教授发布了

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命令之间的区别。从我可以收集的内容返回1将始终返回值(在这种情况下为奇数!)但返回0只会在满足某个条件时返回它?

另外:代码是否为int length(char * name,int start,double finish):将字符长度作为实数返回?

提前感谢任何决定帮助我的人。

6 个答案:

答案 0 :(得分:4)

这称为" Short-circuit evaluation"。

  

...只有在第一个参数不足以确定表达式的值时才执行或计算第二个参数...

因此,您必须弄清楚这两个函数oddeven将返回的内容:

  1. odd():如果n%2 == 1,则返回1,否则返回0
  2. even():如果n%2 == 0,则返回1,否则返回0
  3. 在main()函数中,

    1. odd(3) AND even(2)odd(3)返回1,并检查even(2)的返回值,因此even()是调用。
    2. odd(3) even(2)odd(3)返回1,由于短路评估',它不会需要检查even(2),因此even()未被调用。
    3. odd(4) AND even(7)odd(4)返回0,由于'短路评估',它没有&#t;需要检查even(7),因此even()未被调用。
    4. odd(4) even(7)odd(4)返回0,并检查even(7)的返回值,因此even()为调用。

答案 1 :(得分: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

立即在您的代码上投影;)

答案 2 :(得分:1)

C中的逻辑布尔代数运算符AND和OR(&&||)使用称为short-circuit evaluation的优化进行操作。

这就是优化的工作原理。

想象一下,你为自己想出了一条规则:

如果他们拥有catdog以及fish,则您只会与他人约会。

现在假设你开始和某个你可能有兴趣约会的人交谈。他们说:

  

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

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

现在想象你改变了你的规则:

如果他们拥有catdogfish,则只会与他人约会。

现在假设你开始和某个你可能有兴趣约会的人交谈。他们说:

  

嗯,我没有猫,我有一条鱼,而且我没有狗。

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

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

在您的示例中,even()函数返回true如果传递给它的数字是偶数,odd()函数返回true如果传递给它的数字是false甚至。否则这些函数返回{{1}}。查看每个布尔表达式,并注意必须进行短路评估。

答案 3 :(得分:1)

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

在你的情况下,奇数函数在数字(n)为奇数时返回1,在数字为偶数时返回0。 这是通过"询问"如果提醒时除以2等于1。

当数字(r)为偶数时,偶数函数返回1,当数字为奇数时,函数返回0。 这是通过"询问"如果提醒时除以2等于0。

在您的主函数和(&&)和/或逻辑运算中,对奇数和偶数函数的返回值的结果进行了处理。

示例:odd(3)返回1,偶数(2)返回1然后1&& 1等于1(结果)。

答案 4 :(得分:0)

还有另一种方法可以测试整数类型的偶数值。

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

如果设置了最低有效位,则该数字为奇数。如果没有,那就是偶数。这只是测试那个位。把它扔掉那里就可以消除模数运算......这是另一种选择。不是你问题的答案,但我无法评论......

答案 5 :(得分:0)

我们知道0表示错误,1表示真实。返回部分告诉编译器函数必须将计算结果返回给调用者模块。

因此,返回1意味着向调用者模块发出关于成功执行被调用模块的信号(借助非零数量,即1) 而,

return 0显示一个标志,表明存在导致被调用模块终止的错误/异常。因此,在这种情况下,应使用stderr来提供有关此类错误的详细信息。