Betrachten wir die erste Iteration:
if ((j % i) == 0 && i != 0) {
&&
und ||
den linken Operanden immer zuerst bewerten, und die Bedingung Kurzschluss wird, wenn die Bedingung dreht falsch. Diese
bedeutet, dass, wenn i != 0
, es wird j % i
ersten, bewerten und so Division durch Null. Beachten Sie, dass Division durch Null ein undefiniertes Verhalten ist.
Sie müssen diese Zeilen ersetzen durch:
if (i != 0 && (j % i) == 0) {
diese Weise, wenn i == 0
, (j % i) == 0
nicht
ausgewertet werden, sondern diese Prüfung zu tun, können Sie nicht nur direkt, diesen Fall vermeiden ? Sie können einfach i
1
-m
statt laufen, so dass Sie auch das Kontroll entfernen:
for (i = 1; i < m; i++) {
Edit: Ihre Laufzeit beanspruchen Sie eine Gleitkomma-Ausnahme aufgetreten wahrscheinlich falsch und verwechselte eine arithmetische Ausnahme als Division durch Null; oder es könnte aufgrund einer Compiler-Optimierung sein. Etwas in dieser Richtung.
Sie erhalten es, weil Sie durch Null teilen. 'if ((j% i) == 0 ', wenn' j = 0 'und' i = 0 '. –
Es ist nicht unüblich, dass einige Plattformen Gleitkommaausnahmen als Reaktion auf arithmetischen Überlauf oder Division durch Null ausgeben, selbst wenn keine Gleitkommatypen in Berechnungen involviert sind. – AnT