执行此C代码后j的值是多少?

时间:2017-05-16 15:18:12

标签: c bitwise-operators logical-operators

为什么在执行以下代码后j的值为零?

int main()
{
    int i = 0, j = 0;

    if (i && (j = i + 10))
    //do something ;
}

为什么值10如果我替换逻辑和按位和?

另外,为什么在执行下面的代码后j的值再次为零?

    int i = 10, j = 0;

    if (i || (j = i + 10))

        //do something

        ;

5 个答案:

答案 0 :(得分:3)

因为逻辑和(&&)短路。考虑:

a() && b() && c();

如果a()返回false,则根据操作的定义,整个结果将为false,因此无需计算b()和{ {1}}(实际上,C不会执行c()b())。在您的情况下,c()在注意到&&(在C中为假)后放弃。

类似地,第一个表达式上的逻辑或(i == 0)短路计算结果为true。考虑:

||

如果a() || b() || c() 仍然返回false(如前面的示例所示),但a()返回true,则不会评估b(),因为整个逻辑操作的值已经知道评估c()

Bitwise和(b())是完全不同于逻辑和。您使用逻辑和控制流(决定运行什么代码);您使用按位并计算位上的操作。按位操作不像逻辑操作,它们更像是算术操作 - 它们的行为与例如&+

答案 1 :(得分:2)

&&短路视为以下内容会更容易:

int main()
{
   int i = 0, j = 0;

   if (i){
      if(j = i + 10)){
          //do something ;
      }
   }
}

这相当于你的例子。如果您按照提到的那样替换订单(j = i + 10) && i,则等效性将如下所示:

int main()
{
   int i = 0, j = 0;

   if (j = i + 10){
      if(i)){
          //do something ;
      }
   }
}

您可以自己查看为什么j的值在第一个代码块中为零,在第二个代码块中为十。

答案 2 :(得分:1)

因为i && (j = i + 10)表示短路行为的逻辑AND操作。由于(j=i + 10)是逻辑0(false),因此未评估i。每个表达式必须求值为标量逻辑结果。

答案 3 :(得分:1)

j = i + 10j == i + 10不同。前者为j指定了值(在这种情况下为10,因为i0),后者将ji + 10进行比较。< / p>

如果&& j = i + 10被忽略,因为它已知道i为0,因此第一部分为false。当您将其设为&时,它会查看&运算符的两侧并为j赋值。您可能会或可能不会尝试做什么 - 它不清楚您要对代码执行的操作。

答案 4 :(得分:1)

我更喜欢这样看:

if (A && B)
{
    DoSomething();
}

相同
if (A)
{
    if (B)  // So B is only evaluated when A results in TRUE
    {
        DoSomething();
    }
}

if (A || B)
{
    DoSomething();
}

相同
if (A)
{
     DoSomething();
}
else if (B)  // So B is only evaluated when A results in FALSE
{
    DoSomething();
}