如何解决这个编译错误

如何解决这个编译错误

本文介绍了如何解决这个编译错误“Using unassigned local variable 'hak'"什么时候使用goto?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试以下代码.它给了我一个警告使用未分配的局部变量‘hak’".我想我在这里遗漏了一些东西.

我希望它显示 "3 defa yanlış giriş yaptınız.Müşteri hizmetleri temsilcisiyle görüşünüz.İyi günler dileriz."当局部变量hak"等于0".但它总是显示Hatalı Giriş Yaptınız".Lütfen tekrar deneyiniz.2 hakkınız kalmıştır."

 Console.Write("Seçmek istediğiniz 'Kullanıcı Adı'nı belirtiniz: ");string kullanici_adi = Console.ReadLine();FARKLISIFRE:Console.Write("Lütfen Şifrenizi giriniz: ");string sifre = Console.ReadLine();Console.Write("Girmiş olduğunuz şifreyi tekrar giriniz:");string sifre2 = Console.ReadLine();int karsilastirma = String.Compare(sifre, sifre2);如果(karsilastirma==0){Console.WriteLine(Tebrikler!Kaydınız başarılı bir şekilde oluşturulmuştur.");}别的{Console.WriteLine("Girmiş olduğunuz şifreler birbirinden farklıdır. Lütfen tekrar deneyiniz.");转到 FARKLISIFRE;}Console.Write("Giriş yapmak için lütfen '1' seçeneğini giriniz: ");char komut = Convert.ToChar(Console.ReadLine());Console.Clear();如果(komut=='1'){转到 GIRIS;}别的{Console.Write("Çıkış yaptınız. İyi günler dileriz.");转到结束;}国际哈克 = 3;吉瑞斯:Console.Write("Lütfen Kullanıcı Adınızı Giriniz: ");string kullanici_adi_giris = Console.ReadLine();Console.Write("Lütfen belirlemiş olduğunuz Şifrenizi giriniz: ");字符串 sifre_giris = Console.ReadLine();int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);int karsilastirma_sifre = String.Compare(sifre, sifre_giris);如果(karsilastirma_k_adi == 0 && karsilastirma_sifre == 0){Console.Write("Başarıyla Giriş Yaptınız.Hoşgeldiniz.");}否则如果(哈克== 0){Console.Write("3 defa yanlış giriş yaptınız. Müşteri hizmetleri temsilcisiyle görüşünüz. İyi günler dileriz.");}别的{哈克--;Console.WriteLine("Hatalı Giriş Yaptınız. Lütfen tekrar deneyiniz. {0} hakkınız kalmıştır.", hak);转到 GIRIS;}结尾:Console.ReadKey();}
解决方案

你得到这个编译错误,因为这行从来没有被执行过:

int hak = 3;

这是因为 GOTO、LABELS 的位置和测试条件 if...else 在这一行之上:你永远不会通过这一行.

为了解决这个编译错误以及由此产生的设计问题,您需要重构所有这些以删除所有的 GOTO.

确实,在编译的时候,在谈执行之前,if (komut == '1') ... else ...hak 的创建在 never到达,前往GIRISEND.

因此,在您尝试使用 hak 之后,它从未被分配过,并且编译器知道并告诉您.

为了编译,你需要写:

GIRIS:国际哈克 = 3;

但是使用 GOTO 既无用又不干净,是一种非常糟糕的

每个世纪避免多次跳转,请改用重构.

GOTO 仍然被认为有害吗?

意大利面代码

使用本地方法的最小解决方案示例

if ( komut == '1' ){国际哈克 = 3;GIRIS(ref hak);}别的{Console.Write("Çıkış yaptınız. İyi günler dileriz.");}Console.ReadKey();void GIRIS(ref int hak){Console.Write("Lütfen Kullanıcı Adınızı Giriniz: ");string kullanici_adi_giris = Console.ReadLine();Console.Write("Lütfen belirlemiş olduğunuz Şifrenizi giriniz: ");字符串 sifre_giris = Console.ReadLine();int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);int karsilastirma_sifre = String.Compare(sifre, sifre_giris);如果(karsilastirma_k_adi == 0 && karsilastirma_sifre == 0){Console.Write("Başarıyla Giriş Yaptınız.Hoşgeldiniz.");}否则如果(哈克== 0){Console.Write("3 defa yanlış giriş yaptınız. Müşteri hizmetleri temsilcisiyle görüşünüz. İyi günler dileriz.");}别的{哈克--;Console.WriteLine("Hatalı Giriş Yaptınız. Lütfen tekrar deneyiniz. {0} hakkınız kalmıştır.", hak);GIRIS(ref hak);}}

I'm trying below code. It gives me a warning "Use of unassigned local variable 'hak' ". I guess I'm missing something here.

I want it to display "3 defa yanlış giriş yaptınız. Müşteri hizmetleri temsilcisiyle görüşünüz. İyi günler dileriz." when local variable "hak" equals to "0". But it always display "Hatalı Giriş Yaptınız. Lütfen tekrar deneyiniz. 2 hakkınız kalmıştır."

                   Console.Write("Seçmek istediğiniz 'Kullanıcı Adı'nı belirtiniz: ");
        string kullanici_adi = Console.ReadLine();
        FARKLISIFRE:
        Console.Write("Lütfen Şifrenizi giriniz: ");
        string sifre = Console.ReadLine();
        Console.Write("Girmiş olduğunuz şifreyi tekrar giriniz: ");
        string sifre2 = Console.ReadLine();

        int karsilastirma = String.Compare(sifre, sifre2);
        if (karsilastirma==0)
        {
            Console.WriteLine("Tebrikler! Kaydınız başarılı bir şekilde oluşturulmuştur.");
        }
        else
        {
            Console.WriteLine("Girmiş olduğunuz şifreler birbirinden farklıdır. Lütfen tekrar deneyiniz.");
            goto FARKLISIFRE;
        }

        Console.Write("Giriş yapmak için lütfen '1' seçeneğini giriniz: ");
        char komut = Convert.ToChar(Console.ReadLine());
        Console.Clear();
        if (komut=='1')
        {
            goto GIRIS;
        }

        else
        {
            Console.Write("Çıkış yaptınız. İyi günler dileriz.");
            goto END;
        }

        int hak = 3;

        GIRIS:
        Console.Write("Lütfen Kullanıcı Adınızı Giriniz: ");
        string kullanici_adi_giris = Console.ReadLine();
        Console.Write("Lütfen belirlemiş olduğunuz Şifrenizi giriniz: ");
        string sifre_giris = Console.ReadLine();

        int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);
        int karsilastirma_sifre = String.Compare(sifre, sifre_giris);

        if (karsilastirma_k_adi == 0 && karsilastirma_sifre == 0)
        {
            Console.Write("Başarıyla Giriş Yaptınız. Hoşgeldiniz.");
        }
        else if (hak == 0)
        {
            Console.Write("3 defa yanlış giriş yaptınız. Müşteri hizmetleri temsilcisiyle görüşünüz. İyi günler dileriz.");
        }
        else
        {
            hak--;
            Console.WriteLine("Hatalı Giriş Yaptınız. Lütfen tekrar deneyiniz. {0} hakkınız kalmıştır.", hak);
            goto GIRIS;
        }

        END:
        Console.ReadKey();
    }
解决方案

You got this compile error because this line is never executed:

int hak = 3;

It is because of the GOTOs, the position of the LABELS and the test condition if...else above this line: you never pass this line.

To solve this compile error as well as the design problem which is thus generated, you need to refactor all that to remove all the GOTOs.

Indeed, when compiling, before talking about executing, the if ( komut == '1' ) ... else ..., the hak creation in never reached, going to GIRIS or END.

Thus after when you try to use hak, it never was assigned and the compiler know that and tell you that.

Just to get to compile, you need to write:

GIRIS:
int hak = 3;

But using GOTOs is trashy and not clean, a very bad smell, as well as being source of mistakes and weird behaviors.

Avoid goto more than one once per century, and use refactoring instead, please.

GOTO still considered harmful?

Spaghetti code

Example of a minimal solution using a local method

if ( komut == '1' )
{
  int hak = 3;
  GIRIS(ref hak);
}
else
{
  Console.Write("Çıkış yaptınız. İyi günler dileriz.");
}

Console.ReadKey();

void GIRIS(ref int hak)
{
  Console.Write("Lütfen Kullanıcı Adınızı Giriniz: ");
  string kullanici_adi_giris = Console.ReadLine();
  Console.Write("Lütfen belirlemiş olduğunuz Şifrenizi giriniz: ");
  string sifre_giris = Console.ReadLine();

  int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);
  int karsilastirma_sifre = String.Compare(sifre, sifre_giris);

  if ( karsilastirma_k_adi == 0 && karsilastirma_sifre == 0 )
  {
    Console.Write("Başarıyla Giriş Yaptınız. Hoşgeldiniz.");
  }
  else if ( hak == 0 )
  {
    Console.Write("3 defa yanlış giriş yaptınız. Müşteri hizmetleri temsilcisiyle görüşünüz. İyi günler dileriz.");
  }
  else
  {
    hak--;
    Console.WriteLine("Hatalı Giriş Yaptınız. Lütfen tekrar deneyiniz. {0} hakkınız kalmıştır.", hak);
    GIRIS(ref hak);
  }
}

这篇关于如何解决这个编译错误“Using unassigned local variable 'hak'"什么时候使用goto?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-25 03:05