编译器错误:无法应用运算符“*”和“+”

时间:2010-12-20 07:49:13

标签: c# winforms algorithm

我昨天问了这个问题,但我没有得到很好的答案

在下面的代码中为什么我不能在最后一行使用*和+?并且解决方法是什么?谢谢

    private void bigzarb(int u,int v)
    {
        double n;
        int x=0;
        int y;
        int w=0;
        int z;
        string[] i = textBox7.Text.Split(',');
        int[] nums = new int[i.Length];
        for (int counter = 0; counter < i.Length; counter++)
        {
            nums[counter] = Convert.ToInt32(i[counter]);
        }

        u = nums[0];
        double firstdigits =Math.Floor(Math.Log10(u) + 1);
         v = nums[1];
        double seconddigits = Math.Floor(Math.Log10(v) + 1);
        if (firstdigits >= seconddigits)
        {
            n = firstdigits;

        }
        else
        {
            n = seconddigits;

        }
        if (u == 0 || v == 0)
        {
            MessageBox.Show("the Multiply is 0");
        }
        string threshold = textBox9.Text;
        int intthreshold = Convert.ToInt32(threshold);
        int intn = Convert.ToInt32(n);
        if (intn <= intthreshold)
        {

            double uv = u * v;
            string struv = uv.ToString();
            MessageBox.Show(struv);

        }
        else
        {
           int m  =Convert.ToInt32(Math.Floor(n / 2));

            x = u % 10 ^ m;
            y = u / 10 ^ m;
            w = v % 10 ^ m;
            z = v / 10 ^ m;

            bigzarb(x, w) *( 10 ^ m) +(bigzarb(x,w)+bigzarb(w,y))*10^m +bigzarb(y,z);///compiler gives error operator "*"and"+" cannot be applied to operands of type'void'and'int'

///and compiler gives error operator "*"and"+" cannot be applied to operands of type 'void' and 'void'
        }


    }

4 个答案:

答案 0 :(得分:5)

嗯,这里有一些问题:

  • 您正在尝试使用调用方法的结果,但该方法没有返回值...因此没有结果可以相乘。这就是编译器所抱怨的。
  • 我怀疑你认为^执行“强力”操作 - 它实际上是一个按位xor
  • 您的最终陈述实际上并没有 任何包含计算结果的内容

鉴于您的方法没有返回任何内容,您认为将在bigzarb(x, w) *( 10 ^ m)等表达式中使用哪些值?

答案 1 :(得分:1)

您的方法bigzarb具有无效签名,您在计算中使用该签名。

答案 2 :(得分:1)

Jon Skeet已经回答了这个问题,但我会更明确地解释这一行上究竟发生了什么......

bigzarb(x, w) *( 10 ^ m) + (bigzarb(x,w)+bigzarb(w,y))*10^m +bigzarb(y,z);

让我们把它分成几个部分

第一个陈述是

bigzarb(x, w)

但正如你从Jon的回答中看到的那样 - 你没有从这个方法中返回一个值......

private void bigzarb(int u,int v)

现在让我们用它的实际值替换那个位,现在我们已经解释了它:

[void] *( 10 ^ m) + (bigzarb(x,w)+bigzarb(w,y))*10^m +bigzarb(y,z);

同样适用于所有其他对bigzarb的调用 - 所以让我们替换它们......

[void] * ( 10 ^ m) + ([void] + [void]) * 10 ^ m + [void];

所以你的问题是,为了使用数学运算符,你需要数字 - 但你没有数字,因为你的方法是无效的。

你可以改变你的方法来返回一个数字 - 但要注意递归...当你调用这个方法时,它会调用自己三次,每次调用都会导致另外三次调用该方法。不好!<​​/ p>

答案 3 :(得分:0)

这是因为

rerturn函数类型gzarb(x,w)为void,因此你无法对void指针进行任何操作。

并且在最后一行中,您正在运行计算中使用gzarb的输出。