为什么我会在分配变量时出错,但变量的类型相同?

时间:2018-02-15 19:34:00

标签: c

我正在尝试使用函数的结果来分配变量。

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。我知道我会得到帮助,我试着尽力制定这个问题。

2 个答案:

答案 0 :(得分:1)

(((k) & 1) ? tmp : out)不是l值。结果是tmpout的值,而不是变量名。

您可以尝试这样的事情;

  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));