Type casts

0

Proszę o wytłumaczenie poniższego przykładu. Po skompilowaniu otrzymuje wynik u=2.000000. Znam pojęcie operatora trójargumentowego oraz przesunięcia bitowego, jednak jak sama próbuje to liczyć to wynik zawsze wychodzi różny od 2.000000.

int main 
{
double u = 0xBADCAB1E ? 1<<1 : 0xDEADCODE 
printf("u=%lf\n", u)
}
0

Bez średników to chyba się nawet nie skompiluje;

0

Tak, bez średników się na pewno nie skompiluje, aczkolwiek problem już został rozwiązany.
Mam natomiast kolejne pytanie: czy poniższy kod można zapisać z użyciem pętli 'while', tak, aby wynik kompilacji byl równoważny? Mnie to nie wychodzi i chcę się upewnic czy dobrze myślę (z użyciem pętli 'do while' zgadza się).

#include<stdio.h>

 int main (void)
{
int = 7;
printf("rząd 1.\n");
for (int i = 0, j = 3; (i + 5) < x + 10 && j > -50; ++i, j -=3)
{
printf(" rząd 2.\n");
if ( j % 4)
printf("rząd 3.\n");
--i;
}
printf("rząd 4.\n");
return 0;
}
0

Jasne że można bo i czemu nie? For ma składnie:
for(warunek_wstepny; warunek_trwania; krok)
więc zawsze mozesz to zamienić na while:

warunek_wstepny;
while(warunek_trwania){
//instrukcje
krok
}
0

Zamieniłam to w taki sposób (o ile jest to poprawne) i wynik kompilacji nie jest taki sam. Nie wiem gdzie tkwi błąd.

 
#include<stdio.h>
 
 int main (void)
{
int x= 7, i = 0, j = 3;
printf("rząd 1.\n");
{while((i + 5) < x + 10 && j > -50)
printf(" rząd 2.\n");
++i;
j -=3;
if ( j % 4)
printf("rząd 3.\n");
--i;
}
printf("rząd 4.\n");
return 0;
}
2

Kiedy się nauczycie? Gwarantuje, że nie znajdziesz problemu w tak sformatowanym kodzie.

1

Po sformatowaniu:

#include <stdio.h>

int main(void)
{
    int x = 7, i = 0, j = 3;
    printf("rząd 1.\n");
    {
        while ((i + 5) < x + 10 && j > -50)
            printf(" rząd 2.\n");
        ++i;
        j -= 3;
        if (j % 4)
            printf("rząd 3.\n");
        --i;
    }
    printf("rząd 4.\n");
    return 0;
}

Następnym razem sam staraj się dobrze formatować.

0

@Justyna87 jak sformatujesz kod po ludzku to od razu widać że zjadłaś { i } z pętli while a dodałas je w jakims losowym miejscu. Brawo.

0

Dopatrzyłam sie tego po napisaniu zapytania, ale i tak dziekuję za odpowiedź :) chciałabym się jednak jeszcze dowiedzieć czy ten kod da się bardziej zoptymalizować? W jaki sposob?

#include<stdio.h>
 
 int main (void)
{
int x = 7;
printf("rząd 1.\n");
for (int i = 0, j = 3; (i + 5) < x + 10 && j > -50; printf("rząd 2.\n", ++i, j -=3)
{
   if ( j % 4)
   printf("rząd 3.\n");
   --i;
     }
printf("rząd 4.\n");
return 0;
} 

niestety jestem dopiero po drugich zajęciach z programowania, więc zadaje jeszcze głupie pytania na forum.

1

Ale co ty chcesz optymalizować? Jeśli juz to przepisz ten kod na wersje czytelną dla człowieka bo teraz to jest jakaś kupa.

0
Justyna87 napisał(a):

niestety jestem dopiero po drugich zajęciach z programowania, więc zadaje jeszcze głupie pytania na forum.

Zapamiętaj zatem (bo widzę, że problem dalej się powtarza):
Kod ma być czytelny dla człowieka. Programowanie jest przyjemne tylko wtedy, kiedy nie utrudniasz go sobie na siłę. Powiedziałbym nawet, że dobry kod jest w stanie przeczytać i jako-tako zrozumieć ktoś, kto z programowaniem nie ma wiele wspólnego. Byle by nie był kompletnym idiotą. Dla czytelności warto poświęcić mikrooptymalizacje (które są złem tak czy siak), więc jeśli ktoś się będzie chwalił, że napisał kod działający 1.3x szybciej od Twojego a po miesiącu nie będzie wiedział o co tam chodzi to możesz czuć się wygrana.

0

Przepraszam - rzeczywiscie jest kupa i moje niedopatrzenie, bo zły kod przekopiowałam, wiec utrudnianie czytajacym nie było celowe. W każdym razie - dzięki za feedback. Problem został rozwiązany.

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