c++ operator overloading

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Feb 25 12:18:47 EET 2005


On 2005-02-25 10:40, Antonis Valakas <avalak at intracom.gr> wrote:
>Christos Ricudis wrote:
>> Otan oi antres htan antres, oi pointers ginotan anetotata cast se int :P
>
> Ναι, και μετά που οι άντρες γίνανε κάτι άλλο, all hell broke loose με
> buffer overflows, return to libc attacks, code injection και δε
> συμμαζεύεται.  Ως παλιός developer, πρώην [sys|net]admin και νυν
> συστεμάς γενικώς, το μόνο που έχω να σας πω είναι ΓΡΑΦΤΕ ΣΩΣΤΟ ΚΑΙ
> ΠΟΙΟΤΙΚΟ ΚΩΔΙΚΑ.  Πόσοι από εσάς ξέρουν ότι τις αναθέσεις πρέπει να
> τις γράφετε
>
> 1==i
>
> και όχι
>
> i==1

Πρώτον, αυτό που υπάρχει παραπάνω δεν είναι _ανάθεση_, αλλά _σύγκριση_.

Δεύτερον, αυτό το εμετικό στυλ γραφής δεν συμφωνεί με τον τρόπο που
σκέφτονται οι κανονικοί άνθρωποι.  Τα προγράμματα πρέπει να γράφονται
πρώτα από όλα για να διαβάζονται[1], οπότε δεν έχει νόημα ένας τρόπος
γραφής που αναγκάζει τον προγραμματιστή να σκέφτεται:

	Αν το 3 είναι ίσο με το i.

Είναι ανάποδο, αισχρό και δε σας ευχαριστούμε καθόλου που το
μοιραστήκατε μαζί μας.

Τρίτον, αυτό που πας να αποφύγεις με το συγκεκριμένο "hack" είναι το
παρακάτω:

> γιατί μπορεί να γίνει το
>
> if(i=1) {...}   <--- OOPS, forgot '=' instead of '=='
>
> το οποίο επιστρέφει ΠΑΝΤΑ true, γιατί στην C το αποτέλεσμα μιας
> ανάθεσης είναι 1.

Κι αν χρησιμοποιείς με σωστό τρόπο τον compiler σου (δηλαδή έχεις
ενεργοποιημένα τα warnings), θα δεις κάτι σαν:

% orion:/tmp/foo$ make
% Warning: Object directory not changed from original /tmp/foo
% cc -O2 -fno-strict-aliasing -pipe -Wsystem-headers -Werror -Wall \
% -Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
% -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
% -Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
% -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -c foo.c
% foo.c: In function `main':
% foo.c:4: warning: suggest parentheses around assignment used as truth value
% *** Error code 1
%
% Stop in /tmp/foo.
% orion:/tmp/foo$

> Αν όμως αυτό συνηθίσεις να το γράφεις ανάποδα, τότε το
>
> if(1=i) {...}   <--- OOPS, forgot '=' instead of '=='
>
> θα χτυπήσει ο compiler και θα το δεις αμέσως.

Ο compiler θα χτυπήσει κι όταν τον χρησιμοποιείς Σωστά(TM).

> Θυμάμαι που έψαχνα μια ώρα ένα λάθος στον κώδικα, όπου ένα i το είχα
> γράψει 1 (άσχετο).

Χρησιμοποιείς λάθος fonts :P

[1] Τάδε έφη Donald E. Knuth, και έχει δίκιο.




More information about the Linux-greek-users mailing list