为什么不能回归((a ++)%4)

时间:2014-08-14 06:16:02

标签: c

我有一个C函数:

static uint8_t func( uint8_t a )
{
   return ( (a++) % 4 );
}

我打电话的时候:

uint8_t b = 0;
b = func(b);

我发现b仍然是0而不是1.为什么?

7 个答案:

答案 0 :(得分:5)

使用后增量时,在计算表达式后,该值将递增。 这意味着首先它将在表达式中替换a并对其进行评估,在完成评估后,它将增加a

return ( (a++) % 4 );

这里需要

return ( (0) % 4 ); // after this expression is solved 'a' becomes 1

如果您想返回1,请使用预增量 -

return ( (++a) % 4 ); 

在这种情况下,在评估表达式之前,它将增加a

return ( (1) % 4 ); // so it will return 1.

return ((a+1)%4);

你也可以使用上面的表达式。它不会修改你收到的a的价值。

答案 1 :(得分:4)

因为

return ( (a++) % 4 );

类似于

uint8_t result = a%4;
a = a + 1;
return result;

尝试

return (++a) % 4;

答案 2 :(得分:2)

该行

return ( (a++) % 4 );

相当于:

unit8_t temp =  ( a % 4 );
a++;
return temp;

后缀增量运算符的工作原理。评估了它们的值并在对象使用它们之后增加它们的值。

答案 3 :(得分:2)

使用后增量运算符,在计算表达式后递增

因此表达式(a++) % 4产生与a % 4相同的值。

然而,修改参数毫无意义,当然是通过值传递。写得像这样:

static uint8_t func(uint8_t a)
{
    return (a+1) % 4;
}

答案 4 :(得分:0)

   return ( (a++) % 4 );

更改为

   return ( (++a) % 4 );

你会得到你想要的东西

答案 5 :(得分:0)

我认为你应该使用++a,因为a++在使用a的值后完成增量 并且在增量后使用++a值。

答案 6 :(得分:-1)

您可以将代码修改为:

static void func( uint8_t *a )
{
  *a=++(*a) % 4;
}

并将其命名为:

uint8_t b = 0;
func(&b);