chiossif Δημοσ. 10 Αυγούστου 2006 Μέλος Δημοσ. 10 Αυγούστου 2006 ...ή και για να δώσω τροφή σε νέες "δοκιμές". #include <stdio.h> char *s="Hello world!\n"; main(){return putchar(*s++)?main():0;} ...κάτι τέτοιο εννοούσα. Καμιά άλλη ιδέα;
chiossif Δημοσ. 4 Σεπτεμβρίου 2006 Μέλος Δημοσ. 4 Σεπτεμβρίου 2006 #include <stdio.h> const char *s="Hello world!\n"; int main(void){return putchar(*s++)?main():0;} για να σας προλάβω. Καμιά άλλη ιδέα, δική σας ή ξένη;
alkisg Δημοσ. 4 Σεπτεμβρίου 2006 Δημοσ. 4 Σεπτεμβρίου 2006 >char *s = "Hello word"; int i; do { printf("%c", [b]i[s][/b]); } while (s[++i] != '\0') Το περίεργο είναι το i, αντί να λέει s... Σε κάποιο φόρουμ το είδα, σωστό είναι, αριθμητική των pointers...
chiossif Δημοσ. 4 Σεπτεμβρίου 2006 Μέλος Δημοσ. 4 Σεπτεμβρίου 2006 Το περίεργο είναι το i' date=' αντί να λέει s[i']...Σε κάποιο φόρουμ το είδα, σωστό είναι, αριθμητική των pointers... Δεν νομίζω. Και απ' ότι φαίνεται δεν συμφωνεί και η gcc (απόσπασμα από το τερματικό μου): chiossif@ENIAC:~> cat alkisg_hello.c #include <stdio.h> int main(void){ char *s = "Hello word"; int i; do { printf("%c", i); } while (s[++i] != '\0'); return 0; } chiossif@ENIAC:~> gcc alkisg_hello.c chiossif@ENIAC:~> ./a.out Segmentation fault chiossif@ENIAC:~> Ενδιαφέρον έχει να ρίξω μια ματιά. Πού το βρήκες;
dop Δημοσ. 4 Σεπτεμβρίου 2006 Δημοσ. 4 Σεπτεμβρίου 2006 s == *(s+i) == *(i+s) == i Παλιό κολπάκι αλλά άνευ αξίας... Το πρόγραμμα από την άλλη δεν είναι σωστό, αφού δεν αρχικοποιείται το i. Edit: *(s+i) και *(i+s) ήταν εσφαλμένα s+i και i+s
chiossif Δημοσ. 4 Σεπτεμβρίου 2006 Μέλος Δημοσ. 4 Σεπτεμβρίου 2006 @dop: Γράψε τον κώδικα να το δούμε... Δεν κατάλαβα ποιά είναι η αρχικοποίηση του i.
alkisg Δημοσ. 5 Σεπτεμβρίου 2006 Δημοσ. 5 Σεπτεμβρίου 2006 Δίκιο έχει ο dop, στην αρχή πήγα να γράψω μόνο το loop, μετά είπα άντε ας συμπληρώσω και τις μεταβλητές και ξεχάστηκα... int i = 0; Σωστό είναι, κάνει και με τον gcc compile και run... Δε θυμάμαι που το είχα βρει, ήταν η πρώτη και τελευταία επίσκεψή μου σ' εκείνο το forum (ελληνικό πάντως).
chiossif Δημοσ. 5 Σεπτεμβρίου 2006 Μέλος Δημοσ. 5 Σεπτεμβρίου 2006 #include <stdio.h> int main(void){ char *s = "Hello world.\n"; int i; i=NULL; do { printf("%c", i); } while (s[++i] != '\0'); return 0; } αυτό τρέχει...
dop Δημοσ. 5 Σεπτεμβρίου 2006 Δημοσ. 5 Σεπτεμβρίου 2006 i=0 για να είσαι σωστός απόλυτα. Σε κάποιες μηχανές το NULL δεν ορίζεται σαν (void*)0, οπότε θα έχεις πρόβλημα.
chiossif Δημοσ. 5 Σεπτεμβρίου 2006 Μέλος Δημοσ. 5 Σεπτεμβρίου 2006 Δεν είμαι βέβαιος: ο ρόλος του i στην i είναι πλησιέστερα στην έννοια του δείκτη (pointer στην μνήμη του Η/Υ) παρά του αριθμοδείκτη (index ή αρίθμηση στοιχείων πίνακα Α[0], Α[1], Α[2],...). Πάντως θεωρώ απίθανο να αποδίδει υλοποίηση της C με την i=NULL; τιμή στο int i διάφορη του μηδέν. Αν ξέρεις κάτι ενημέρωσέ μας. Για να πω την αλήθεια το έκανα και για να σε προλάβω, φίλε dop, να με ξαναδιορθώσεις (ISO/ ANSI C) αλλά και πάλι το κατάφερες.
Sta Δημοσ. 5 Σεπτεμβρίου 2006 Δημοσ. 5 Σεπτεμβρίου 2006 s == s+i == i+s == i Παλιό κολπάκι αλλά άνευ αξίας... Μάλλον εννοείς: s==*(s+i)==*(i+s)==i' date=' το οποίο και βέβαια παίζει επειδή έτσι υπολογίζεται το s[i'] εσωτερικά σε έναν compiler. Σε κάποιες μηχανές το NULL δεν ορίζεται σαν (void*)0, οπότε θα έχεις πρόβλημα. Δεν ξέρω αν παντού ορίζεται έτσι, πάντως ισχύει η σχέση: NULL==(void*)0 σε όλες τις υλοποιήσεις που είναι conforming, αφού σε pointer context η σταθερά 0 ισούται με NULL. Για αυτό εξάλλου παίζουν και τα if(p) και if(!p), όταν ο p είναι δείκτης και θέλουμε να διαπιστώσουμε αν είναι NULL ή όχι. Επίσης, όπως πολύ σωστά υπενόησες δεν υπάρχει καμία δέσμευση όλα τα bits της σταθεράς NULL να είναι 0. Συνήθως θα προτιμηθεί μία διεύθυνση που δε μπορείς να γράψεις ώστε να μην έχουν παρενέργειες τα buggy προγράμματα. Η αλήθεια είναι ότι το ζήτημα είναι αρκετά πολύπλοκο (όχι όμως περίπλοκο): π.χ. η NULL είναι μία macro που γίνεται expand σε μία null pointer constant που με τη σειρά της αν ανατεθεί σε ένα δείκτη αυτός θα έχει null pointer value. Βάσει αυτού του ορισμού, υπάρχουν και οι επιτρεπόμενοι τρόποι που μπορεί μία υλοποίηση να ορίσει το NULL. Μιας και πάει καιρός από τότε που τα έμαθα αυτά, με διορθώνετε στα επιμέρους.
dop Δημοσ. 5 Σεπτεμβρίου 2006 Δημοσ. 5 Σεπτεμβρίου 2006 Το i είναι ένας αριθμός που έχει το ρόλο index, οπότε το καλύτερο είναι να του φερόμαστε σαν σε αριθμό. Θα σε παραπέμψω στην σελίδα http://c-faq.com/null/nullor0.html που εξηγεί πότε βάζουμε NULL. Επίσης στο http://c-faq.com/null/macro.html πώς ορίζεται το NULL. Επιπλέον έχω κάνει ένα λάθος παραπάνω: μερικές μηχανές έχουν non-zero bit pattern για το NULL. Παρόλα αυτά είναι δουλειά του compiler να αναθέτει την σωστή όταν βλέπει το 0 ή το NULL σε pointer. Με βάση αυτά, αν αρχικοποιήσεις το int i=NULL; υπάρχει μια περίπτωση (όταν δεν κάνει σωστό semantic check ο compiler) να αναθέσεις στο i μια μη μηδενική τιμή. Edit: μόλις τώρα είδα - μετά την απάντησή μου - ότι με διόρθωσε ο Sta και στα 2 ατοπήματα. Mea culpa x2
chiossif Δημοσ. 20 Σεπτεμβρίου 2006 Μέλος Δημοσ. 20 Σεπτεμβρίου 2006 ...από εδώ: http://www.cuillin.demon.co.uk/nazz/trivia/hw/hw_c.html > #define _ (int) putchar main() { int c = 0110 ;_(c);c+=29;_(c);c+=7 ;_(c);_(c);c+=3;_(c) ;c=0x20;_(c);c=0127 ;_(c);c+=24;_(c); c+=0x3;_(c);c-= 6;_(c);c-=010; _(c);c=0x21; _(c);_(10) ;c+=66;}
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.