Αλλά ας αναπτύξω γιατί η C δεν είναι καλή ιδέα για αρχάριους.Θα επικεντροθώ αρχικά στο ότι ο νηματοθέτης θέλει να μάθει C++.
Η C++ μπορεί να χαρακτηριστεί ως superset της C.Προσφέρει OO κομμάτι,generic programming είναι γενικά,multiparadigm.Έχει πιο χαλαρούς κανόνες σε κάποια κομμάτια(variable declarations).Φέρει δομές της C,όπως τα structs αλλά σε ένα superset manner.
Αλλά δεν είναι αυστηρό superset.Υπάρχουν πολλές διαφορές και θα αναφέρω ενδεικτικά κάποιες.
Αυτή η δήλωση :
extern void func();
Είναι διαφορετική στις δύο γλώσσες.Στη C++ αυτή είναι μια συνάρτηση η οποία δεν έχει value return και δεν παίρνει καμμια παράμετρο,οπότε και καλείται για όποιο side-effect έχει.Αλλά στη C είναι μια συνάρτηση η οποία δεν έχει return value αλλά
δεν υπάρχει πληροφορία για το argument list της.
Αυτό :
int *i = malloc(sizeof(int) * 3);
Είναι valid στη C γιατί το standard της επιτρέπει implicit conversion απο void* σε άλλου τύπου pointer.
Στη C++ πρέπει να γίνει expilict cast :
int *i = static_cast<int*>(malloc(sizeof(int) * 3));
//Η μήπως να μην μπλέκουμε τα sets oπότε
int *i = (int*) malloc(sizeof(int)*3);
Επίσης το
sizeof(
char) είναι διαφορετικό σε κάθε γλώσσα.
Αυτό που θέλω να πω πάντως,είναι πώς με δυσκολία, μπορείς να γράψεις κώδικα που γίνεται compiled και στις δύο γλώσσες.Δεν υπάρχει κανένα πλεονέκτημα απο το να μάθεις C πρώτα.Επίσης υπάρχουν πάρα πολλά ιδιώματα (acceptable) της C,που στη C++ αποτελούν κακό practise.Preprocessor abuse,αστόχαστη χρήση primitive pointers,τα semantics των structs.
Καλύτερα να μάθει Objective C,αυτή είναι κανονιστικό superset της C(Οχι της C99 όμως).
Τώρα ειδικά γιατί όχι C :
Mου έρχονται πάρα πολλά πράγματα στο μυαλό,θα προσπαθήσω να στοιχειοθετήσω μερικά.Τα strings στη C είναι POD arrays(Με end-marker).Χρειάζονται functions για
βασικές λειτουργίες επί των strings.Τα arrays σε function calls γίνονται decayed σε pointers.Υπάρχει χρήση jumps για κάτι σαν εμβρυακό "exception handling".Μπορώ να αναλύσω πιο δεξιοδικά άμα το ζητήσει κάποιος,αλλά υποθέτω προς το παρόν πώς επαρκούν αυτά.
Η C θα σου δώσει ένα abstraction layer πάνω απο ένα εύρος αρχιτεκτονικών επεξεργαστών.Γιατί απλούστατα να μην μάθεις μια high-level γλώσσα και χρήσιμα paradigms;Άμα κάποιος θελήσει να εμβαθύνει στο υλικό,μαθαίνει assembly RISC αρχιτεκτονικής,δεν χάνει το χρόνο του πάνω σε abstractions.
Eδώ μιλάμε για αρχάριους όμως.Δεν βλέπω κανένα λόγο να μάθει C
αρχικά.Όταν αποφασίσει ότι χρειάζεται να κατανοήσει κάποια πιο low-level στοιχεία,ας προσπαθήσει C++ ή έστω και C(Κάτι που και πάλι δεν το συνιστώ).
Δεν μαθαίνεις κάποιον να κολυμπάει πετώντας τον στα νερά με τους καρχαρίες.Τον βάζεις στα ρηχά με μπρατσάκια.
Ορίστε και ένα
κείμενο απο κάποιον που μπορείς να εμπιστευτείς τη σχέση του με το computer science.