C 在&;及&;下列程序中的操作员?
我在一个网站上看到了下面的代码,可以在不使用“if”的情况下检查奇数或偶数。但是,我无法理解编码及其工作原理。请你解释一下代码的功能部分好吗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
#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");
}