我执行了以下代码片段(使用gcc编译)
#include <stdio.h>
void main()
{
double b = 5 % 3 & 4 + 5 * 6;
printf("%lf", b);
}
输出为2.000000 我不明白为什么会这样。
答案 0 :(得分:6)
按位&
的{{3}}低于*
,%
,+
。操作数将分组为
double b = (5 % 3) & (4 + 5 * 6);
5%3
= 2 = 0000 0000 0000 0000 0000 0000 0000 0010
34
= 0000 0000 0000 0000 0000 0000 0010 0010
逐位ANDing都会产生0000 0000 0000 0000 0000 0000 0000 0010
= 2
答案 1 :(得分:3)
要获得30.000000
的预期输出,您必须指定操作顺序 - 您可以使用parens。您需要告诉编译器您希望AND
直接发生在5 % 3
之后。
double b = (5 % 3 & 4) + 5 * 6; // Specify precedence
输出:30.000000
原始代码以此优先顺序执行。
double b = (5 % 3) & (4 + (5 * 6)); // Added parens to show how it executes
输出:2.000000
基本上,你是AND
(5%3)和(4 +(5 * 6))。
答案 2 :(得分:1)
问题是由于按位和(&amp;)运算符引起的。
它可能看起来不直观,但它比乘法,加法和模数运算具有更低的优先级。
这被视为C&#34; &#34; &#34;丹尼斯·里奇(Dennis Ritchie),但仍然接受了这种语言。
你可以在这里找到Ritchie的论述,其中包括:http://cm.bell-labs.com/who/dmr/chist.html
答案 3 :(得分:0)
&
的优先级低于您的想象。您可以全部查看here。