Skocz do zawartości
czara

Sztuczki i kruczki w C - czyli jak zagmatwac kod programu.

Rekomendowane odpowiedzi

Dzis mialem egzam poprawkowy z programowania :)

A ze wykladowca bardzo lubi wszelki sztuczki i kruczki nie obylo sie bez nich i tym razem :/

Jedno z zadan wygladalo tak:

#include <stdio.h>int main(void){   int y,i=2;   int a[5]={0,20,30,40,50};   y=a[i];   printf("n%d",y);   y=i[a];  // skad to sie wzielo ??   printf("n%d",y);   return(0);}
Trzeba bylo napisac dlaczego ten program jest dobry choc wyglada na zly.

I co nam wydrukuje na ekranie .

Wie ktos moze skad sie wzielo

y=i[a];
Bo ja mysle ze z ksiazki po tytulem "Sztuczki i kruczki w C - czyli jak zagmatwac kod programu i uczynic go nieczytelnym" :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zaraz ide na wymiki egzamu wiec sie dowiem dlaczego tak jest :)

No i zapyta po co mi wiedziec takie cos??

Jedynie zeby bardziej skompikowac kod programu.

Zeby to chocby byl krotszy zapis niz normalnie ...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zaraz ide na wymiki egzamu wiec sie dowiem dlaczego tak jest :)

No i zapyta po co mi wiedziec takie cos??

Jedynie zeby bardziej skompikowac kod programu.

Zeby to chocby byl krotszy zapis niz normalnie ...

To wygląda na błąd w specyfikacji ansi c. W pracy próbowałem skompilować ten przykład pod borland builder (poszło) i hitech c (od razu wywalił błąd że "a" jest nieprawidłowym indeksem tablicy w drugim przypisaniu).

Dziwne że ktoś próbuje uczyć programowania na niejasnych sztuczkach wynikających z zagmatwanej i koślawej gramatyki C :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam nadzieje że ja nie będe miał takiego wykładowcy. Ja nierozumiem po co uczyc sie cos takiego. Jestem ciekawy czy specyfikacja C zawiera coś takiego. Albo przykładowo gość zadaje wam zadanie:

 

Co wypisze ten program?

#include <iostream.h>void main(){        for (int i=0; i<10; i++);        cout<<i; }
Co mu odpowiecie?

 

A tak wogóle to jaki kompilator jest najblizszy najnowszej specyfikacji c++?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

poprawke zdalem :)

ajgon : studiuje dziennie :)

megabyte : ja to rozumiem tak ze gosc se gdzies to znalazl uznal za ciekawe i teraz meczy tym studentow ;)

A ze takie rzeczy ci sie calkiem nie przydadza to go malo obchodza ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co wypisze ten program?

#include <iostream.h>void main(){        for (int i=0; i<10; i++);        cout<<i; }
Co mu odpowiecie?

Ale fajna podpucha ;] Na 105% odpowiedzialbym: 0123456789 :D Jeden maly srednik, a tyle roboty robi ;) Nie zmienia to faktu, ze uwalanie za cos takiego studentow jest totalnym sk*.* :evil:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To ze sie nie kompiluje pod gcc to wiem... bo pozniej sprawdzilem, ale uznalem to za pomijalny blad, bo tu chodzilo o ten srednik a nie blad kompilacji ;) (chyba, ze faktycznie chodzilo o to, zeby odpowiedziec, ze program sie nie skompiluje... to znaczie utrudnia zadanie, bo pewnie nikt nie szukal takiego bledu w kodzie)

Ciekawiej by to zadanie wygladalo, jakby cout byl dodatkowo "wciety":

for (i=0; i < 10;i++);    cout << i;
Zmylka jeszcze wieksza, bo ja nie widzac wciecia wyczulem odrazu podstep, z nim moze dalbym sie nabrac.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To ze sie nie kompiluje pod gcc to wiem... bo pozniej sprawdzilem, ale uznalem to za pomijalny blad, bo tu chodzilo o ten srednik a nie blad kompilacji ;) (chyba, ze faktycznie chodzilo o to, zeby odpowiedziec, ze program sie nie skompiluje... to znaczie utrudnia zadanie, bo pewnie nikt nie szukal takiego bledu w kodzie)

Ciekawiej by to zadanie wygladalo, jakby cout byl dodatkowo "wciety":

for (i=0; i < 10;i++);    cout << i;
Zmylka jeszcze wieksza, bo ja nie widzac wciecia wyczulem odrazu podstep, z nim moze dalbym sie nabrac.
Mi właśnie chodziło o to że się nie skompiluje. Podobny przykład jak z tymi tablicami. Na jednych kompilatorach przejdzie a na drugich nie. Kolega Gie-eN-Zet z tego forum miał właśnie takie zadanie na egzaminie. Napisał że program nie będzie działał i gość mu tego nie uznał. A z tym wcięciem do faktycznie dałem ciała. :) Mogłem zrobić to wcięcie albo nie zrobić żadnych wcięć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To wygląda na błąd w specyfikacji ansi c.

to nie jest blad. ten cudak wynika z przemiennosci dodawania.

chodzi o to ze tablica jest kawalkiem pamieci ktory gdzies sie zaczyna. a potem od tego miejsca przesuwasz sie o indeks * rozmiar typu danych.

 

a wiec masz zapis: pointer do poczatku tablicy + indeks * rozmiar typu danych (a)

z drugiej strony masz: indeks * rozmiar typu danych + adres poczatku tablicy.(i[a])

 

pic polega na tym ze oba te zapisy sa identyczne w kodzie maszynowym. o ile sam kompilator nie sprawdza takich burakow, to po kompilacji wychodzi to samo w obu przypadkach. bezuzyteczny bajer.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To wygląda na błąd w specyfikacji ansi c.

to nie jest blad. ten cudak wynika z przemiennosci dodawania.

chodzi o to ze tablica jest kawalkiem pamieci ktory gdzies sie zaczyna. a potem od tego miejsca przesuwasz sie o indeks * rozmiar typu danych.

 

a wiec masz zapis: pointer do poczatku tablicy + indeks * rozmiar typu danych (a)

z drugiej strony masz: indeks * rozmiar typu danych + adres poczatku tablicy.(i[a])

 

pic polega na tym ze oba te zapisy sa identyczne w kodzie maszynowym. o ile sam kompilator nie sprawdza takich burakow, to po kompilacji wychodzi to samo w obu przypadkach. bezuzyteczny bajer.

dokladnie to z ta przemienniscia dodawania powwiedzial mi ten wykladowca kiedy go ostatnio o to zapytalem ;)

ale nie chcial powiedziec dlaczego musze to umiec :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mi sie ten drugi programik spokojie kompiluje pod net studio. a takie <span style="color:red;">[ciach!]</span>ly to racjecz zlosliwosc a nie wiedza, bo bardzi jchodzi o spostrzegawczośc a nie o znajomosc programu. syntaxy robi prawie kazdy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mi także ten drugi się kompiluje na BC 3.11 i dev-c++ 4.

a co do sensowności takich zadań to fakt... niestety smutną prawdą jest żę studentów uczy się głupot a nie myślenia ... składnia to jedno a jakieś sztuczki to drugie. Potem siada taki beidny człowiek i co prawda zna doskonala składnie ale jak ma problem to nie wie od której strony zacząć. Często nie potrafi sobie nawet wyobrazić jak ten program ma działać.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie tu sie nizgodze . studiuje informatyke na plibudzie warszawskiej wydzial mini kierunek informatyka i msuze powiedziec ze co jak co ale <span style="color:red;">[ciach!]</span>l i takich debilizmow to nas nie ucza. tu poziom jest na serio wysoki i nacisk jest kladziony na rzeczy przydatne.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#include <iostream.h>void main() {         for (int i=0; i<10; i++);         cout<<i;  }
To sie nie powinno skompilowac z powodu zakresu ważności zmiennej i, która jest deklarowana w for i obowiązuje tylko do końca pętli. Jednakże wiele kompilatorów (w tym C++Builder) toleruje taki zapis i nie zgłaszając błędu udostępnia tę zmienną poza pętlą.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Rozwiazanie powyzszej zagadki to kod assmowy generowany przez rozne kompilatory. Np VC++ zapis for(int i....) przerabia tak ze i jest deklarowane przed forem stad jej zakres waznosci to od fora w dol bloku z forem. Niestety z powodu obrzydzenia do wszelkich borlandow (poza niesmiertelnym 3.11 ;] ) nie moge podejrzec tam tworzonego kodu.

Ale to zalezy od interpretacji kompilatora ktore lekko traktuja se specyfikacje jezyka ;) - czyli ze i ma miec zakres waznosci tylko fora.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kolejna sesja i znow kolejne sztuczki i kruczki w c :)

Zadanie z wczorajszego kola :

Dokoncz kod tak aby nastapila zamiana wartosci zmiennych x i y bez uzywania dodatkowych zmiennych :x=1234;y=2345;
i w sumie nizele mnie to zaskoczylo :/

w sumie too nikt nie napisal tego dobrze

wie ktos moze jak to napisac ??

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kiedys widzialem program, ktory wyswietla swoje zrodla bez korzystania z operacji plikowych oczywiscie. Wtedy moja wiedza byla nikla, jesli nie zerowa, a teraz chetnie jeszcze raz bym przestudiowal sobie ten kod, wie ktos z Was moze gdzie to lezy?

Pisze w tym topicu, bo tam tez bylo troche ciekawych kruczkow :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie



×
×
  • Dodaj nową pozycję...