operator inkrementacji w C# i C++

1

@Zimny Krawiec: najwyraźniej nie zawsze 39: https://godbolt.org/z/ax1jYe
O C# się nie wypowiem bo nie znam się na nim ponad rozumienie podstaw, ale w temacie C++ Twój post wprowadza w błąd.
To jest UB, tłumaczono Ci to wcześniej. Raz jeszcze: kompilator może zrobić cokolwiek (tu specyfikacja się kończy), typowo zachowa się tak, żeby wygenerować optymalny kod ale nie musi być to nijak przewidywalne powtarzalne i błędnie rozumujesz, że to nie jest podane w specyfikacji.

3
Zimny Krawiec napisał(a):

To nie znaczy też jak inni sugerują że kompilator może policzyć cokolwiek jak funkcja Random . Po prostu nie wszystkie reguły są podawane w specyfikacjach

Tu masz w standardzie języka podane, że to jest undefined behavior, czyli kompilator może iść i usunąć wszystko z dysku. Jak masz UB, to program jest niepoprawny. Jeżeli nie wiesz, co to jest UB, to nie zbliżaj się do C++, to nie jest "to nie jest zdefiniowane przez standard" tylko "to jest zdefiniowane przez standard jako zachowanie niezdefiniowane".

Zimny Krawiec napisał(a):

Nie zgodzę się z tym ale ci tego teraz ci tego nie udowodnię. Optymalizacja nie powoduje tego że otrzymamy inny wynik tylko np. że coś będzie działo szybciej albo nie będzie się niepotrzebnie powtarzać

Optymalizacja może zmienić wynik, może spowodować cofanie się w czasie albo inne nieogarnialne rzeczy. https://devblogs.microsoft.com/oldnewthing/20140627-00/?p=633

2

@Zimny Krawiec: nie udowodnisz bo nie masz racji:

[C++14: defns.undefined]: [..] Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). [..]

https://www.nayuki.io/page/un[...]r-in-c-and-cplusplus-programs
To o czym mówisz to jest implementation defined i to jest coś innego. Ale nie ma zastosowania w tym przypadku.

1

@Zimny Krawiec:
Wszelkie rozważania na temat tego, jak powinien działać program w przypadku w prowadzenia do niego undefined behavior nie mają sensu, ponieważ według specyfikacji C++ "[Undefined behavior] renders the entire program meaningless".
Dziękuje, do widzenia, zagadka rozwiązana, koniec tematu.

0

@Aterwik: W innych językach jest inaczej niż w C++ ? Moim zdaniem jest tak samo .

0
Zimny Krawiec napisał(a):

@Aterwik: W innych językach jest inaczej niż w C++ ? Moim zdaniem jest tak samo .

Obstawiam, że to raczej C++ jest niechlubnym wyjątkiem, a reszta popularnych języków ma wyspecyfikowane działanie pre- i post-inkrementacji.

Sprawdziłem działanie:

var a = 0
wypisz(++a + ++a + ++a)

Na C#, Javie i JS i wszystkie wypisują 6. Nie chciało mi się sprawdzać tego twierdzenia o specyfikacji.

Ciekawostka. Co wypisze podany kod w C++:

#include <iostream>

void printer(int a, int b, int c) {
  std::cout << a << " " << b << " " << c << std::endl;
}

int main() {
  int a = 0;
  printer(a++, a++, a++);
  return 0;
}

Odpowiedź:
Pod GCC wypisze: 2 1 0
Pod clangiem wypisze: 0 1 2 (i rzygnie ostrzeżeniem podczas kompilacji: warning: multiple unsequenced modifications to 'a' [-Wunsequenced])

0

@Aterwik: Skoro tak wszystko wiesz to powiedz mi , czy na poziomie asemblera albo kodu maszynowego też możemy mieć niezdefiniowane zachowanie ?

0
Zimny Krawiec napisał(a):

@Aterwik: Skoro tak wszystko wiesz to powiedz mi , czy na poziomie asemblera albo kodu maszynowego też możemy mieć niezdefiniowane zachowanie ?

Można mieć, np:
https://www.felixcloutier.com/x86/bsf
https://www.felixcloutier.com/x86/bsr

Poza tym masa instrukcji x86 pozostawia flagi procesora w stanie niezdefiniowanym.

0
Afish napisał(a):

Tu masz w standardzie języka podane, że to jest undefined behavior,

Co nie znaczy że to jest dobrze.
Uważam że to jest niedobrze, i takich UB nie powinno być w języku. W przytoczonym C# takie wyrażenia z ++ i -- mają zawsze zdefiniowany wynik o ile się kompilują (niektóre przypadki UB z C++ się w C# nie skompilują).
Kiedyś potrafiłem z głowy policzyć ile to będzie ++a + ++a + ++a w C#, teraz już mi się nie chce głowy zaśmiecać zbędnymi informacjami.

0
Azarien napisał(a):

Co nie znaczy że to jest dobrze.
Uważam że to jest niedobrze, i takich UB nie powinno być w języku

Zgadzam się.

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