C 'loop' olumsuz bir ifade ile çöküyor | Netgez.com
SORU
1 Temmuz 2013, PAZARTESÄ°


C 'loop' olumsuz bir ifade ile çöküyor

Aşağıdaki kod bir çalışma zamanı hatası ile C çöker:

#include <string>

using namespace std;

int main() {
    string s = "aa";
    for (int i = 0; i < s.length() - 3; i  ) {

    }
}

Bu kod çökmez ise:

#include <string>

using namespace std;

int main() {
    string s = "aa";
    int len = s.length() - 3;
    for (int i = 0; i < len; i  ) {

    }
}

Ben bunu açıklamak için nasıl yapacağımı bilmiyorum. Bu davranışın nedeni ne olabilir?

CEVAP
1 Temmuz 2013, PAZARTESÄ°


s.length() işaretsiz tamsayı türüdür. Ne zaman 3, negatif yaptığınız çıkarın. unsigned bir ifadeçok büyük.

Geçici bir çözüm (dize INT_MAX uzun up uzun geçerli olarak) bu gibi olabilir:

#include <string>

using namespace std;

int main() {

    string s = "aa";

    for (int i = 0; i < static_cast<int> (s.length() ) - 3; i  ) {

    }
}

Hiç döngü girin.

Çok önemli bir ayrıntı muhtemelen bir uyarı almış olması "imzalı ve imzasız değer karşılaştırılması". Sorun eğer bu uyarıları dikkate almazsanız, çok tehlikeli bir alan girinörtülü"integer conversion"(*)tanımlanmış bir davranış olan , ama takip etmek zor olur. en iyisi hiç bu derleyici uyarılarını göz ardı etmektir.


(*) De "integer promotion" hakkında bilmek ilginizi çekebilir.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • Strata1000

    Strata1000

    28 EYLÃœL 2009
  • YouChewBu

    YouChewBu

    26 Ocak 2009