我有一个C函数:
static uint8_t func( uint8_t a )
{
return ( (a++) % 4 );
}
我打电话的时候:
uint8_t b = 0;
b = func(b);
我发现b
仍然是0而不是1.为什么?
答案 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);