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.
Bunu Paylaş:
Neden bir ifade bir sabit yerine, bir ...
Eğer bir dize geçerli bir adres olup o...
Nasıl Java düzenli ifade ile^n b^a n m...
C Guıd için# Düzenli ifade...
Düzenli ifade Eşleşmesi için Desen,......