Zagadka: mając poniższy kod w C lub C++ i zakładając standardowy target x86 lub x64, odpowiedz, najlepiej bez kompilowania kodu, co powinna zwrócić funkcja f:
unsigned int m(unsigned short a, unsigned short b) { return a * b; } unsigned int f() { for(unsigned short x = 65535u; x>0; x--) for(unsigned short y = 65535u; y>0; y--) if (m(x,y) > 49999u*49999u) return x+y; return 666; } #programowanie #zagadkaprogramistyczna #jezykc #cpp
@Freedie: Wszystko się ładnie zagnieżdża, a pętle są po prawidłowych zakresach. Pominąłem klamerki, bo Wypok zżera wcięcia. To nie jest taka trywialna zagadka ( ͡°͜ʖ͡°)
@smyl: No w sumie mógł być jeden for i m(x,x), no i mógł być for w drugą stronę, ale to nie zmieniałoby nic istotnego w tej zagadce. Rozumowanie prowadzące do odpowiedzi byłoby takie same.
@vytah: clang zwraca 666, gcc 131070, mamy więc UB, o ile przekręcenie unsigned jest zdefiniowane, tak przekręcenie typu signed już nie, zakładam że gdzieś jest promocja do typu signed
f
:unsigned int m(unsigned short a, unsigned short b) {
return a * b;
}
unsigned int f() {
for(unsigned short x = 65535u; x>0; x--)
for(unsigned short y = 65535u; y>0; y--)
if (m(x,y) > 49999u*49999u) return x+y;
return 666;
}
#programowanie #zagadkaprogramistyczna #jezykc #cpp
To nie jest taka trywialna zagadka ( ͡° ͜ʖ ͡°)
Komentarz usunięty przez autora
Albo nie umiem czytac AST dumpa :(
m(600,600)
zwraca360000
, czyli znacznie więcej niżstd::numeric_limits::max()
czyUSHORT_MAX
.czyli pierwszy return?
Komentarz usunięty przez autora
for
im(x,x)
, no i mógł byćfor
w drugą stronę, ale to nie zmieniałoby nic istotnego w tej zagadce. Rozumowanie prowadzące do odpowiedzi byłoby takie same.unsigned short x = 65535u;
unsigned short y = 65535u;
if (m(x,y) > 49999u*49999u) return x+y;
return 666;
Więc to mi wyglada na UB.
Dobre!