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
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.
Neden bir ifade bir sabit yerine, bir ...
Düzenli ifade bir e-posta adresi doğru...
Satır eşleştirmek için düzenli ifade e...
Nasıl Ruby anahtarı bir ifade yazabili...
Telefon numarası için kapsamlı bir düz...