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

  • boniver

    boniver

    17 NİSAN 2006
  • Mindy

    Mindy

    20 NİSAN 2006
  • ThePhestor

    ThePhestor

    22 Mart 2011