Prosta pętla for się nie kończy

Odpowiedz Nowy wątek
2019-07-16 07:44
0
#include <stdio.h>
#include <stdint.h>
int main()
{
    int32_t a = 0;
    for (int32_t p = 0x7fffffff; p > 0; p++) a += p;
    puts("END");
    return a;
}

mingw64 v.8.1.0
Zmienna p nie zmienia swojej wartości i pętla for nigdy się nie kończy. Dlaczego?

Pozostało 580 znaków

2019-07-17 12:20
amd
0

Dobrze że przynajmniej warning jest klarowny.
(Przykro że są ludzie którzy ignorują warningi :P)

Niestety flagi -O2 -Wall -Wextra -Wpedantic w gcc 8 nie dają warningów. W gcc 9 już tak. - rajszym 2019-07-17 19:01
No to faktycznie bez warnings to słabo to wygląda :P. Juz sobie wyobrażam debugowanie tego. "panie dzieją się niestworzone rzeczy ..." - amd 2019-07-17 21:06

Pozostało 580 znaków

2019-07-17 13:33
1

Ciekawostka z -O1 kompilator podszedł do optymalizacji zupełnie inaczej!
Zmienił pętle for na stałe wyrażenie 2147483647 czyli 2^31 -1.
A to oznacza, że rozkminił przepełnienie int-a i to że wykonają się dwie iteracje p=2147483647 oraz p=0.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Pokaż pozostałe 4 komentarze
A. Moja wina (albo forum :P). Dzięki. :) Czyli nadal brakuje znaku =. - Silv 2019-07-17 18:22
może lepiej poeksperymentuj z flagami na https://godbolt.org/z/VLKHaL - MarekR22 2019-07-17 18:23
Ale ja nie chcę eksperymentować (wtedy bym się przyzwyczaił i pewnie nie miał problemu z nazwami flag), ale właśnie chcę rozumieć out of the box, bez potrzeby wdrażania się w specyfikę składni (danego?) kompilatora C++. - Silv 2019-07-17 18:25
PS. Przy czym – w porządku; nie mówię teraz o mojej nieuważności. To osobny problem. - Silv 2019-07-17 18:29
PS2. Wiem, że czasem sam używam tego np. watch -n1 w shellu, i można się zastanawiać, czy ma sens mówienie o ujednoliceniu argumentów linii komend dla wszystkich programów. Jednak moim zdaniem watch --n=1 także wygląda lepiej. - Silv 2019-07-17 18:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0