antonio12 Temat założony przez niniejszego użytkownika |
[C++] Zły wynik dla kodu: printf( "%.2lf", 4 / 9 ) » 2015-02-02 21:25:28 printf( "%.2lf", 4 / 9 ); Dlaczego program wypisuje 0.50 a nie 0.40 ? Bo przecież 4/9 to 0.44 |
|
Monika90 |
» 2015-02-02 21:45:10 4/9 jest równe zero typu int, program ma niezdefiniowane zachowanie bo typ się nie zgadza, %lf wymaga double, a podajesz int |
|
DejaVu |
» 2015-02-02 21:46:34 Bo nie rzutujesz do floata.
/edit: Swoją drogą myślałem że to 21f, a nie 2lf :) Więc rzutowanie powinno być do double jak napisała Monika90. |
|
Monika90 |
» 2015-02-02 21:54:12 Może być też rzutowanie na float. Printf nie jest w stanie odróżnić między float a double, ponieważ float i tak jest konwertowane do double podczas przkazywania argumentów. |
|
antonio12 Temat założony przez niniejszego użytkownika |
» 2015-02-02 22:10:32 Bo mam takie zadanie, chodzi o 4 wypis programu: #include <stdio.h> #include <stdlib.h> #include <string.h>
int main() { int z1 = 4, z2 = 8; int m = 1; int t[ 10 ] = { - 1, - 2, - 3 }; char s1[ 30 ] = "programowanie", s2[ 30 ] = "strukturalne"; double z =( ++z2 -( z1-- ) ) %--z1; printf( "1) %.1lf\n", z / 3 ); printf( "2) %d\n", --s1[ 2 ] <* s2 ); printf( "3) %c\n", *( strlen( s1 ) - 4 + s1 ) ); printf( "4) %.2lf\n", !( z1 % z2-- ) + 2.0 * z1 / z2 ); printf( "5) %d\n",( 3 *( ++*( t + 2 ) >> 2 ) ) ); printf( "6) %d\n", !( !z2 ||--z1 ) ); return 0; } W 4 wypisie wyświetla 0.5 I jeszcze mam pytanie dotyczące 5 wypisu jak tam jest (++*(t+2)>>2) to dla mnie to wygląda na (-2>>2), a operatory bitowe są tylko do typu unsigned. Pomoże ktoś ? |
|
Monika90 |
» 2015-02-02 22:35:49 W której szkole dają takie zadania? Czy jesteś pewien że dobrze przepisłeś? Brakuje #include <string.h>, brakuje średnika po ostatnim printf, a w przedostatnim jest /n zamiast \n I jeszcze mam pytanie dotyczące 5 wypisu jak tam jest (++*(t+2)>>2) to dla mnie to wygląda na (-2>>2), a operatory bitowe są tylko do typu unsigned. Pomoże ktoś ?
|
Do signed też mozna ich używać, a w tym konkretnym przypadku wg 5.8p3 The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
|
Czyli jaki tego będzie wynik, to musisz przeczytać w dokumentacji konkretnego kompilatora. |
|
antonio12 Temat założony przez niniejszego użytkownika |
» 2015-02-02 23:15:21 już poprawiłem, tylko nie wiem czy ogarnę ten operat bitowy dla liczby ujemnej. Możesz pokazać jak to się robi ? |
|
Monika90 |
» 2015-02-02 23:29:32 -2 zapisanie w kodzie uzupełnienia do dwóch wygląda tak 11111111111111111111111111111110 po przesunieciu o dwie pozycje w prawo wygląda tak (bit znaku jest kopiowany) 11111111111111111111111111111111 a to jest -1, czyli -2>>2 jest równe -1
Ale tak naprawdę to wynik zależy od kompilatora.
I w ogóle to zadanie jest głupie i ma niezdefiniowane zachowanie. |
|
« 1 » 2 3 |