有什么用?&和&&运算符在以下程序中?

时间:2014-02-15 16:19:23

标签: c

我在一个网站上看到以下代码,无需使用“if”即可检查奇数或偶数。但是,我无法理解编码及其工作原理。请解释代码的功能部分。

#include<stdio.h>
#include<conio.h>
int main()
{
    int no;
    clrscr();
    printf("Enter a number");
    scanf("%d",&no);
    (no & 1 && printf("odd")) || printf("even");
    return 0;
    getch();
}

8 个答案:

答案 0 :(得分:4)

&用于逐位AND,&&用于逻辑AND。

现在逻辑是数字即使其最低有效位为0也是奇数,如果LSB为1 则为奇数。
(no & 1)检查LSB是0还是1,即如果LSB为0,则它将为0,如果LSB为1则为1 0
如果是&&则由于操作符的短路行为而未评估||的正确表达式,因此"even"的正确子表达式打印no & 1。如果1&&,则评估"odd"的右子表达式并打印{{1}}。

答案 1 :(得分:4)

no & 1获得no的最低位。因此,如果no & 1为奇数,则no得1。

如果no & 1 == 0,则跳过&&的右侧,(no & 1 && printf("odd"))评估为FALSE,并评估printf("even")

如果no & 1 != 0,则评估&&的右侧并在控制台上打印"odd"。如果(no & 1 && printf("odd"))成功,则printf()被评为TRUE,然后跳过||的右侧。

答案 2 :(得分:3)

no & 1是按位AND。如果0为偶数,则该操作的结果为no;如果1为奇数,则no结果为1。这是因为只设置了&&的最低有效位。

(no & 1 && printf("odd"))中的AND是布尔值no & 1,表达式依赖于该运算符的短路评估。如果false评估为nono & 1为偶数),则不会打印该语句。当true评估为no时(printf("odd")为奇数时),将评估no & 1语句。

false求值为&&的情况下,整个false表达式求值为printf,并评估第二个{{1}}语句。

答案 3 :(得分:3)

  1. &no,地址运营商

    scanf("%d",&no);
    

    &no表示变量no的地址。它用于scanf()将结果放在那里。

  2. &,按位AND

    no&amp; 1

    这是no的值,按位AND加上值1.本质上,这给出了最低位的值。如果该位置位,则该值为奇数,否则为偶数。

  3. &&||,短路运营商

    ((expression from above) && printf("odd")) || printf("even");
    
  4. 如果值为奇数,则此表达式应输出odd,如果值为偶数,则输出even

    &&||是所谓的“短路运营商”。所以发生以下情况:

    • 如果表达式为假(== 0),则第一部分的计算结果为(0 && ...),其计算结果为0而不评估第二部分。我们有0 || printf("even"),相当于printf("even")
    • 但是,如果表达式为真(!= 0),则第一部分的计算结果为(1 && ...),其中1 &&是多余的。基本上你有printf("odd") || printf("even")。这取决于printf("odd")返回非零值,以便printf("even")被抑制。

    因此,更好的解决方案将是

    (no & 1) ? printf("odd") : printf("even");
    printf((no & 1) ? "odd" : "even");
    if (no & 1) {
        printf("odd");
    } else {
        printf("even");
    }
    

答案 4 :(得分:2)

所以你想了解(no & 1 && printf("odd")) || printf("even");

  • &表示按位和,因此no & 1表示从1开始获取第一位。
  • &&表示逻辑,但它使用短路,因此如果第一个 true ,则不会评估第二个表达式。
  • ||表示逻辑或,但它使用短路,因此如果第一个 false ,则不会评估第二个表达式。

因此如果(no & 1) == 1打印奇数,或者换句话说,如果no % 2 == 1则会打印奇数;否则它将评估最后一个printf,因此它将打印甚至

答案 5 :(得分:1)

取第一位“不”,如果0跳过&amp;&amp;运算符并继续评估printf(“偶数”)。如果为1,则去评估printf(“odd”)

答案 6 :(得分:1)

&&符合逻辑 true && true为true,其他一切都为false &是按位的。

可以解释为二进制: 代码:

  00000110
& 00000100
----------------
  00000100
================

有关详细信息:http://www.cprogramming.com/tutorial...operators.html 阅读其他按位运算符。

答案 7 :(得分:0)

&amp; no是变量no的地址。 &安培;&安培;是逻辑AND。 ||是OR。