ошибка CS1525 почему это происходит?

#c# #compiler-errors #syntax-error

#c# #ошибки компилятора #синтаксическая ошибка

Вопрос:

Я не знаю почему, но когда я пытаюсь скомпилировать следующий код, я получаю ошибку CS1525, и каждая ) в конце каждой команды while помечается как ошибка:

 static void PrintArray(string[] arr)
{
    int i, sum = 0, subb = 0, pow, x;
    char opper;
    Console.WriteLine("how many numbers does your calculation have?");
    i = Convert.ToInt16(Console.ReadLine());
    arr = new string[i];
    for (i = 0; i < arr.Length; i  )
    {
        Console.WriteLine("enter num {0}"   i);
        arr[i] = Console.ReadLine();
        Console.WriteLine("arr[{0}] = {1}"   i, arr[i]);
    }
    Console.WriteLine("what do you want to do?");
    opper = Convert.ToChar(Console.ReadLine());
    while (opper =  )
    {
        for (i = 0; i < arr.Length; i  )
        {
            sum = sum   Convert.ToInt16(arr[i]);
        }
        Console.WriteLine("your sum is "   sum);
    }
    while (opper = -)
    {
        for (i = 0; i < arr.Length; i  )
        {
            subb = subb   Convert.ToInt16(arr[i]);
        }
        Console.WriteLine("your subb is"   subb);
    }
    while (opper = *)
    {
        pow = Convert.ToInt16(arr[0]);
        for (i = 1; i < arr.Length; i  )
        {
            pow = pow * Convert.ToInt16(arr[i]);
        }
        Console.WriteLine("the resolt is "   pow);
    }
    while (opper = amp;)
    {
        x = Convert.ToInt16(arr[i]);
        for (i = 0; i < arr.Length; i  )
        {
            x = x / Convert.ToInt16(arr[i]);
        }
        Console.WriteLine("your resolt is "   x);
    }
        Console.ReadKey();
}
  

Я буду рад, если кто-нибудь, наконец, сможет мне это объяснить…

Комментарии:

1. как насчет того, что при проверке равенства вы используете == not =

2. и вам понадобятся знаки и — в кавычках, поскольку они являются символами — while (opper == ' ')

Ответ №1:

Учитывая строки (например)

 opper = Convert.ToChar(Console.ReadLine());
while (opper =  )
  

Похоже, вы пытаетесь сравнить ввод символов с оператором. Вы захотите изменить оператор присваивания на оператор сравнения и сравнить символ с другим символом, например:

 opper = Convert.ToChar(Console.ReadLine());
while (opper == ' ')
  

Ответ №2:

пользователь1673882 здесь прав в отношении причины ошибки компиляции. Однако есть несколько других существенных ошибок, о которых вы также должны знать.

Что касается исходной проблемы с компиляцией, у вас есть две проблемы со следующей строкой (и всеми подобными строками);

 while (opper =  )
  

Во-первых, = (одиночный знак «равно») — это присваивание, а не сравнение. Вместо этого вы хотите использовать == here .

Во-вторых, в данном случае это не символ, а операция. (На самом деле, компилятор не может точно определить, какой оператор это может быть).

Даже если вы скомпилируете это, это не сработает, потому что все ваши циклы являются бесконечными циклами. Рассмотрим этот пример:

 char myChar = 'a';

        // Infinite loop
        while (myChar == 'a')
        {
            Console.WriteLine("Test");
        }
  

Как это может выйти из цикла, учитывая, что myChar так будет всегда a ?

Далее следует несколько других разных ошибок:

 subb = subb   Convert.ToInt16(arr[i]);
  

Это можно сократить с помощью

 subb  = Convert.ToInt16(arr[i]);
  

или, возможно, даже

 subb  = (short)arr[i];
  

Кроме того, я предполагаю, что это не должно быть » «, поскольку это точно такая же операция, которую вы выполняете, если операция » » (т. Е. Результат » » и «-» должен быть точно таким же).

 x = x / Convert.ToInt16(arr[i]);
  

Во-первых, такая же очистка, как указано выше:

 x /= (short)arr[i];
  

Во-вторых, здесь вы никогда не проверяете деление на 0, поэтому это может вызвать исключение.

В-третьих, я не уверен, что такое тип x, но «short» определенно не закрывается по делению, т.е.:

 short a = ...
short b...
// May not be another short
Console.WriteLine(a / b);
  

На самом деле, это в некоторой степени относится и к умножению, вычитанию и сложению, поскольку короткие значения имеют конечный размер. Рассмотрим следующий код:

 short overflow = short.MaxValue;

        // -32768
        overflow  ;

        //  32767
        overflow--;

        // -32768 again
        overflow  ;

        // -32767
        overflow  ;

        checked
        {
            overflow = short.MaxValue;

            // Now this results in an OverflowException
            overflow  ;
        }
  

Еще один пример:

 short testArithmetic = 1;
        // This gives us the result that 1 / 2 = 0.
        testArithmetic /= 2;

        // Set this back to 1 for the next operation
        testArithmetic = 1;

        // This is 0.0 too!
        double testArithmeticFloat = testArithmetic / 2;

        // This gives us the result we'd expect
        testArithmeticFloat = 1.0 / 2.0;

        // This'll compile just fine, but you get a DivideByZeroException when you try to execute it
        testArithmetic /= 0;