我正在尝试使用函数的结果来分配变量。
MAT2 _m_pow2(const MAT2 A, int p, MAT2 tmp)
{
MAT2 out;
int it_cnt, k, max_bit;
#define Z(k) (((k) & 1) ? tmp : out)
out = m_get2(A.m, A.n);
tmp = m_get2(A.m, A.n);
if(p == 0)
out = m_ident2(out);
else if(p > 0)
{
it_cnt = 1;
for(max_bit = 0; ; max_bit++)
if((p >> (max_bit+1)) == 0)
break;
tmp = m_copy2(A);
for(k = 0; k < max_bit; k++)
{
Z(it_cnt+1) = m_mlt2(Z(it_cnt), Z(it_cnt));
it_cnt++;
if(p & (1 << (max_bit-1)))
{
Z(it_cnt+1) = m_mlt2(A, Z(it_cnt));
it_cnt++;
}
p <<= 1;
}
if(it_cnt & 1)
out = m_copy2(Z(it_cnt));
}
return out;
#undef Z
}
函数m_mlt2()返回MAT2。 我收到了这些错误:
错误:左值作为赋值的左操作数
Z(it_cnt+1) = m_mlt2(Z(it_cnt), Z(it_cnt));
和
错误:左值作为赋值的左操作数
Z(it_cnt+1) = m_mlt2(A, Z(it_cnt));
我做错了什么?如果它需要更多的细节,请随时询问。提前谢谢!
P.S。我知道我会得到帮助,我试着尽力制定这个问题。
答案 0 :(得分:1)
(((k) & 1) ? tmp : out)
不是l值。结果是tmp
或out
的值,而不是变量名。
您可以尝试这样的事情;
MAT2 out[2];
int it_cnt, k, max_bit;
out[1] = tmp;
#define Z(k) out[(((k) & 1))]
答案 1 :(得分:1)
Z
宏扩展为三元表达式。所以:
Z(it_cnt+1) = m_mlt2(Z(it_cnt), Z(it_cnt));
扩展为(部分):
(((it_cnt+1) & 1) ? tmp : out) = m_mlt2(...);
因此,您在作业( ? : )
的左侧有一个三元句=
。
lvalue
是(非常粗略地说)您可以指定的值。正如this answer指出的那样,在 C (不是 C ++ )中,三元运算符不会产生lvalue
。相反,正如@cleblanc所提到的,它为您提供了表达式的值。
编辑这是C ++代码,所以最好的办法是切换到C ++。从this question修改的示例:
#include<stdio.h>
int main()
{
int a=5,b=6;
( ((a>b) & 1) ? a : b ) = 42;
printf("%d %d\n", a, b);
return 0;
}
在C:
$ gcc foo.c && ./a
foo.c: In function ‘main’:
foo.c:6:26: error: lvalue required as left operand of assignment
( ((a>b) & 1) ? a : b ) = 42;
^
$
在C ++中:
$ g++ foo.cpp && ./a
5 42
$
如果你不能使用C ++,我会使用@chux's idea,引用这里给后人:#define Z(k) (((k) & 1) ? &tmp : &out)
... *Z(it_cnt+1) = m_mlt2(A, *Z(it_cnt));
。