我在一个网站上看到以下代码,无需使用“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();
}
答案 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
评估为no
(no & 1
为偶数),则不会打印该语句。当true
评估为no
时(printf("odd")
为奇数时),将评估no & 1
语句。
在false
求值为&&
的情况下,整个false
表达式求值为printf
,并评估第二个{{1}}语句。
答案 3 :(得分:3)
&no
,地址运营商
scanf("%d",&no);
此&no
表示变量no
的地址。它用于scanf()
将结果放在那里。
&
,按位AND
no&amp; 1
这是no
的值,按位AND
加上值1.本质上,这给出了最低位的值。如果该位置位,则该值为奇数,否则为偶数。
&&
和||
,短路运营商
((expression from above) && printf("odd")) || printf("even");
如果值为奇数,则此表达式应输出odd
,如果值为偶数,则输出even
。
&&
和||
是所谓的“短路运营商”。所以发生以下情况:
(0 && ...)
,其计算结果为0而不评估第二部分。我们有0 || printf("even")
,相当于printf("even")
。(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。