Προς το περιεχόμενο

Ch Iossif's "Hello World"


chiossif

Προτεινόμενες αναρτήσεις

Δημοσ.
...ή και για να δώσω τροφή σε νέες "δοκιμές".

 

#include <stdio.h>

 

char *s="Hello world!\n";

 

main(){return putchar(*s++)?main():0;}

 

...κάτι τέτοιο εννοούσα. Καμιά άλλη ιδέα;

  • 4 εβδομάδες αργότερα...
  • Απαντ. 42
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

#include <stdio.h>

 

const char *s="Hello world!\n";

 

int main(void){return putchar(*s++)?main():0;}

 

για να σας προλάβω.

 

Καμιά άλλη ιδέα, δική σας ή ξένη;

Δημοσ.

>char *s = "Hello word";
int i;

do {
 printf("%c", [b]i[s][/b]);
} while (s[++i] != '\0')

Το περίεργο είναι το i, αντί να λέει s...

Σε κάποιο φόρουμ το είδα, σωστό είναι, αριθμητική των pointers...

Δημοσ.
Το περίεργο είναι το 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:~>

 

Ενδιαφέρον έχει να ρίξω μια ματιά. Πού το βρήκες;

Δημοσ.

s == *(s+i) == *(i+s) == i Παλιό κολπάκι αλλά άνευ αξίας...

 

Το πρόγραμμα από την άλλη δεν είναι σωστό, αφού δεν αρχικοποιείται το i.

 

Edit: *(s+i) και *(i+s) ήταν εσφαλμένα s+i και i+s

Δημοσ.

Δίκιο έχει ο dop, στην αρχή πήγα να γράψω μόνο το loop, μετά είπα άντε ας συμπληρώσω και τις μεταβλητές και ξεχάστηκα...

int i = 0;

 

Σωστό είναι, κάνει και με τον gcc compile και run... Δε θυμάμαι που το είχα βρει, ήταν η πρώτη και τελευταία επίσκεψή μου σ' εκείνο το forum (ελληνικό πάντως).

Δημοσ.

i=0 για να είσαι σωστός απόλυτα. Σε κάποιες μηχανές το NULL δεν ορίζεται σαν (void*)0, οπότε θα έχεις πρόβλημα.

Δημοσ.

Δεν είμαι βέβαιος:

 

ο ρόλος του i στην i είναι πλησιέστερα στην έννοια του δείκτη (pointer στην μνήμη του Η/Υ) παρά του αριθμοδείκτη (index ή αρίθμηση στοιχείων πίνακα Α[0], Α[1], Α[2],...). Πάντως θεωρώ απίθανο να αποδίδει υλοποίηση της C με την i=NULL; τιμή στο int i διάφορη του μηδέν. Αν ξέρεις κάτι ενημέρωσέ μας.

 

Για να πω την αλήθεια το έκανα και για να σε προλάβω, φίλε dop, να με ξαναδιορθώσεις (ISO/ ANSI C) αλλά και πάλι το κατάφερες.

Δημοσ.
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. Μιας και πάει καιρός από τότε που τα έμαθα αυτά, με διορθώνετε στα επιμέρους.

Δημοσ.

Το 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

  • 2 εβδομάδες αργότερα...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...