C 在&;及&;下列程序中的操作员?

C 在&;及&;下列程序中的操作员?,c,C,我在一个网站上看到了下面的代码,可以在不使用“if”的情况下检查奇数或偶数。但是,我无法理解编码及其工作原理。请你解释一下代码的功能部分好吗 #include<stdio.h> #include<conio.h> int main() { int no; clrscr(); printf("Enter a number"); scanf("%d",&no); (no & 1 && printf("od

我在一个网站上看到了下面的代码,可以在不使用“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();
}
#包括
#包括
int main()
{
国际贸易编号;
clrsc();
printf(“输入一个数字”);
scanf(“%d”和“否”);
(1号和打印F(“奇数”)| |打印F(“偶数”);
返回0;
getch();
}

&
用于按位AND,而
&
用于逻辑AND

现在的逻辑是,如果一个数的最低有效位是
0
,那么它是偶数;如果LSB是
1

(no&1)
检查LSB是否为
0
1
,即,如果LSB为
0
,则通过ANDANDIN,它将给出
0
;如果LSB为
1
,则给出
1


如果它是
0
,则由于运算符的短路行为,
&&
的正确表达式不会被计算,因此
|
的正确子表达式将打印
“偶数”
。如果
no&1
1
,则计算
&
的右子表达式并打印
“奇”

&no是变量no的地址。 &&是逻辑和。
||是或。

no&1
获取
no
的最低有效位。因此,如果
no
是奇数,
no&1
得到1

如果
no&1==0
,则跳过
&
的右侧,
(no&1&&printf(“奇数”)
计算为FALSE,而
printf(“偶数”)
计算为FALSE


如果
no&1!=0,然后计算
&&
的右侧,并在控制台上打印
“奇数”
<如果
printf()
成功,则code>(no&1&&printf(“奇数”)
将被评估为TRUE,然后跳过
|
的右侧。

取“no”的第一位,如果0,则跳过&>运算符并继续评估printf(“偶数”)。如果为1,请评估printf(“奇数”)

&&
是否符合逻辑和。
true
&&
true为true,其他所有内容均为false。
&
是按位和

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

有关更多信息:
阅读其他按位运算符。

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

(no&1&&printf(“奇”)
中的
和&
是一个布尔值
,表达式依赖于该运算符的短路求值。如果
no&1
的计算结果为
false
(当
no
为偶数时),则不会打印该语句。当
no&1
计算结果为
true
时(当
no
为奇数时),将计算
printf(“奇数”)
语句


no&1
计算为
false
的情况下,整个
&
表达式计算为
false
,第二个
printf
语句被计算。

所以你想理解
(no&1&&printf(“奇”)| printf(“偶”)

  • 表示按位和因此
    否&1
    表示从1获取第一位
  • &&
    表示逻辑与,但它使用短路,所以如果第一个表达式为真,则不会计算第二个表达式
  • |
    表示逻辑或,但它使用短路,所以如果第一个表达式为false,它不会计算第二个表达式
因此,如果
(no&1)==1
,或者换句话说,如果
no%2==1
,它将打印odd;否则它将计算最后一个printf,以便打印甚至

  • &no
    ,地址运算符

    scanf("%d",&no);
    
    &no
    表示变量
    no
    的地址。它用于让
    scanf()
    将结果放在那里

  • ,按位和

    第一&第一

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

  • 短路操作员

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

    &&
    |
    是所谓的“短路操作员”。因此,发生了以下情况:

    • 如果表达式为false(=0),则第一部分的计算结果为
      (0&&…
      ,其计算结果为0,而不计算第二部分。所以我们有
      0 | | printf(“偶数”)
      ,这相当于
      printf(“偶数”)
    • 但是,如果表达式为true(!=0),则第一部分计算为
      (1&&…
      ,其中
      1&&
      是多余的。所以本质上你有
      printf(“奇数”)| printf(“偶数”)
      。这依赖于
      printf(“奇数”)
      返回非零值,因此
      printf(“偶数”)
      被抑制
    因此,更好的解决方案是可行的

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

    printf
    的输出应该给你一个提示。@alk我不是指
    printf
    的返回值,我指的是输出内容,即
    “奇数”
    “偶数”
    。Ohhhhhhhhh!谢谢各位。我现在可以理解运算符的短路行为了。@user3289137您可能会注意到相同的符号可以用于不同的操作
    &
    可以是运算符的地址,也可以是按位或运算符,这取决于它出现的语法,语法
    &a
    中的
    符号是一元运算符的地址,表达式
    a&b
    <代码>&
    是按位的
    (no & 1) ? printf("odd") : printf("even");
    printf((no & 1) ? "odd" : "even");
    if (no & 1) {
        printf("odd");
    } else {
        printf("even");
    }