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

C 返回0和返回1之间的差异,c,cygwin,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) || ev

我的教授发了

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)是否以实数形式返回字符中的单词长度

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

这被称为“”

…其中,仅当第一个参数不足以确定表达式的值时,才执行或计算第二个参数

因此,您必须了解这两个函数
奇数
偶数
将返回什么:

  • 奇数():如果n%2==1,则返回1,否则返回0
  • 偶数():如果n%2==0,则返回1,否则返回0
  • 在main()函数中

  • 奇数(3)
    偶数(2)
    奇数(3)
    返回1,并检查
    偶数(2)
    的返回值,因此调用
    偶数()
  • 奇数(3)
    偶数(2)
    奇数(3)
    返回1,由于“短路评估”,它不需要检查
    偶数(2)
    ,因此不调用
    偶数()
  • 奇数(4)
    偶数(7)
    奇数(4)
    返回0,由于“短路评估”,它不需要检查
    偶数(7)
    ,因此不调用
    偶数()
  • 奇数(4)
    偶数(7)
    奇数(4)
    返回0,并检查
    偶数(7)
    的返回值,因此调用
    偶数()

  • 当计算逻辑表达式时,它会逐个检查条件,并且只要知道整个表达式(不管剩余的表达式是什么),它就会停止计算它们

    示例

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

    • 检查
      a
      :是
      true
    • 检查
      b
      :否它不是
      true
    结果:表达式错误,无法打印
    Yes

    案例2

    • 检查
      a
      :是
      true
    • 检查
      b
      :是
      false
    结果:表达式正确,并打印
    Yes

    案例3

    • 检查
      a
      :是
      true
    • 检查
      b
      ?!!!为什么?无需检查
      b
      ,因为只有通过检查
      a
      才能知道整个表达式结果,您同意吗
    结果:检查
    a
    并打印
    Yes
    而不检查
    b


    立即将其投影到代码上;)

    C中的逻辑布尔代数运算符AND和OR(
    &&
    |
    )以一种称为的优化方式运行

    这就是优化的工作原理

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

    只有当某人拥有一只
    和一只
    和一条鱼
    时,你才会和他们约会

    现在想象你开始和一个你可能对约会感兴趣的人交谈。他们说:

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

    你什么时候不再注意他们说的话了?一旦他们说他们没有鱼,因为一旦他们说了,他们就打破了你的“和”规则。因此,句子的其余部分完全不相关。这是短路和短路

    现在,假设您更改了规则:

    只有当某人拥有一只
    或一只
    或一条鱼
    时,你才会和他约会

    现在想象你开始和一个你可能对约会感兴趣的人交谈。他们说:

    嗯,我没有猫,我有鱼,我也没有狗

    你什么时候不再注意他们说的话了?一旦他们说他们有一条鱼,因为一旦他们说了,他们就满足了你的“或”规则。因此,句子的其余部分完全不相关。这是短路或短路

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


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

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

    在本例中,当数字(n)为奇数时,奇数函数返回1,当数字为偶数时返回0。 这是通过“询问”提醒是否被2等分1来完成的

    此外,当数字(r)为偶数时,偶数函数返回1,当数字为奇数时返回0。 这是通过“询问”被2等分时的提醒是否为0来实现的

    在主函数中,对奇数和偶数函数的返回值的结果执行and(&&)和or逻辑运算


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

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

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

    如果设置了最低有效位,则该数字为奇数。如果不是的话,那就扯平了。这只是测试那个位。把它扔出去,这样你就可以消除模运算。。。这是另一种选择。这不是对你问题的回答,但我无法评论…

    正如我们所知,0表示虚假,1表示真实。返回部分告诉编译器函数必须将计算结果返回给调用方模块
    if (a && !b) printf("Yes");
    
    if (a || b) printf("Yes");
    
    int IsOdd(int x) { return (x & 1); }
    int IsEven(int x) { return !(x & 1); }