2014-09-18 40 views
12

özelliklerini ihlal ettiği görülüyor, ben (döngünün koşullu fark)C++ sınıfı için bir ödev üzerinde çalışmak ek

// This one works. 
for (int k = 0; k + negwords[j].length() < comments[i].length(); k++) { 
    if (comments[i].substr(k, negwords[j].length()) == negwords[j]) { 
     negativeScore++; 
    } 
} 
//*/ 

/*/ This one doesn't: It fails with an out-of-bounds index. 
for (int k = 0; k < comments[i].length() - negwords[j].length(); k++) { 
    if (comments[i].substr(k, negwords[j].length()) == negwords[j]) { 
     negativeScore++; 
    } 
} 
//*/ 

Neden İlki çalıştığını öyle ama ikincisi kokan bu koştu t? Operasyon sırasına, int'ye, operatör çağrışıcılığına veya OBOE'ye bool zorlamasıyla ilgili bir şey mi?

+10

'length(), imzasız bir türü mi döndürüyor? –

+1

k + yorum olmamalıdır [i] .length() cyan

+0

@cyan: Hayır, ilk döngü koşulunun her iki tarafından 'negwords [i] .length() 'i çıkarırsanız, ikincisini alırsınız. –

cevap

33

modüler ek birini negwords[j].length() veya comments[i].length()unsigned int olarak en az büyük işaretsiz ayrılmaz türü iade ardından k aynı işaretsiz türe terfi edilecek ve kurallar geçerli olur.

Örnek olarak 1 < 2 - 3 bu doğru demektir, çünkü 2 - 3 modüler aritmetik etrafında sarılır, çok büyük bir sayı haline gelir. İlginizi çekiyorsa

, bu davranış kuralını içerir Standard, bölüm 3.9.1 belirtilir:

İmzasız tamsayılar aritmetik modulonun yasalara uyun eder 2 n nerede n, belirli bir tam sayı büyüklüğünün değer temsilindeki bitlerin sayısıdır.

ve etkileri ile ilgili bir dipnot:

Oluşan tamsayı türü ile temsil edilemeyen bir sonuç azalır çünkü işaretsiz aritmetik taşma yapar eder sayıyı modulo Ortaya çıkan işaretsiz tamsayı türüyle temsil edilebilecek en büyük değerden büyük olanı.


Matematikçiler olarak aritmetik bu tür Galois alan cebiri biliyoruz. C++ 'da, imzasız integral türleri için kullanılır. Diğer türler modüler aritmetik kullanmazlar, fakat normal aritmetik normal sayı-aritmetiği ('un gerçek sayıları () cebirini kullanmazlar, çünkü normal aritmetik yoğun sayılamayan sayılar kümesi gerektirir ve bir sonlu bilgisayar boyut sonsuz bir grubun üyelerini temsil edemez.

Hata yaptığımı bildirdiği için Oliver'a teşekkürler. GF (2)^n bitsel işlemleri ve CRC gibi bilgisayar yazılımlarında yapılan bir dizi diğer ortak hesaplamayı yönetir. Ancak, Galois alanlarındaki polinomlar "taşıma" yapmadığından, 1'den fazla bitmeyen aritmetiği tanımlamaz.

+4

@Cyber: Hayır, alt akış "DBL_MIN/2.0 * 2.0" sıfırdır. Bu sarım. –

+0

Hata benim hatam. – CoryKramer

İlgili konular