关于C双类型的行为

时间:2014-07-15 12:52:08

标签: c

我执行了以下代码片段(使用gcc编译)

#include <stdio.h>
void main()
{
    double b = 5 % 3 & 4 + 5 * 6;
    printf("%lf", b);
}

输出为2.000000 我不明白为什么会这样。

4 个答案:

答案 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