Forum: Compiler & IDEs Name für Operator gesucht


von *GAST* (Gast)


Lesenswert?

Hallo, ich verwende in meinem Programm den folgenden Operator:
1
wert_neu = (wert &~ maske);

Mit dieser Anweisung wird ein bestimmtes Bit (das Bit, was in der maske 
auf 1 steht) in wert_neu "gelöscht".
Wie nennt man diesen Operator? Ich suche eine etwas allgemeinere 
Beschreibung, wie das genau funktioniert.

: Verschoben durch User
von Max H. (hartl192)


Lesenswert?

*GAST* schrieb:
> Wie nennt man diesen Operator?
Welcher? Das & (bitweise UND), das ~ (bitweise NICHT) oder das = 
(Zuweisung)?

> Ich suche eine etwas allgemeinere
> Beschreibung, wie das genau funktioniert.
Der Variable wert_neu wird das bitweise UND aus wert und der bitweise 
invertierten maske zugewiesen.

Eine Liste der Operatoren findest du hier:
https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t

: Bearbeitet durch User
von Marius S. (lupin) Benutzerseite


Lesenswert?

Man könnte diese Operation "Maskierung" nennen.
Von mir aus auch "Masken-Operator".

Umgangssprachlich werden dort Bits ausmaskiert.

von Noch einer (Gast)


Lesenswert?

Schönes Beispiel für den Obfuscated C Code Contest.

Klarer währe wohl:
wert_neu = (wert & ~maske);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Klammern kann man auch einfach weglassen, die bewirken hier exakt 
gar nichts.

a = (4);

ist nunmal nichts anderes als

a = 4;

von ..oOo.. (Gast)


Lesenswert?

Noch einer schrieb:
> Schönes Beispiel für den Obfuscated C Code Contest.

"Schön", dass C-Compiler solche schwachsinnigen Quellcodeformulierungen 
ohne Murren übersetzt, statt solchem verwirrenden Zeugs einen 
konsequenten Riegel vorzuschieben.

von Klaus W. (mfgkw)


Lesenswert?

..oOo.. schrieb:
> "Schön", dass C-Compiler solche schwachsinnigen Quellcodeformulierungen
> ohne Murren übersetzt, statt solchem verwirrenden Zeugs einen
> konsequenten Riegel vorzuschieben.

Das ist Absicht!
Der Gedanke dahinter ist der, daß sich nur halbwegs intelligente Leute 
damit auseinandersetzen und die grössten Deppen gar nicht mitspielen.
Leider hat sich diese Hoffnung nicht erfüllt, sie geben trotzdem ihren 
Senf dazu.

von C-hater hater (Gast)


Lesenswert?

Was ist denn daran verwirrend?
Das ist ein bitweise_UND und ein bitweise_NICHT.
Für Leute, die oft in C programmieren kann das PHP $name .= $nachname; 
genauso verirrend aussehen.
Meine Frau kann mit
int main(void);

nix anfangen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

*GAST* schrieb:
> wert_neu = (wert &~ maske);
C-hater hater schrieb:
> Was ist denn daran verwirrend?
GAST meinte wohl, dass "&~" ein Operator ist, den er so nicht in 
seinem C-Buch findet...

: Bearbeitet durch Moderator
von C-hater hater (Gast)


Lesenswert?

>GAST meinte wohl, dass "&~" ein Operator ist, den er so nicht in
>seinem C-Buch findet...
Das stimmt wohl.
Dann würde ich aber gleich einen Schritt weiter gehen. Wenn ein Ausdruck 
nicht gut lesbar ist würde ich ein Makro draus machen

#define CLR_BITsIN(x, bitmask) ...
oder
#define CLR_BIT(x, bitnr) ...

wenn's dann nicht schon irgenwo in <supermakros.h> gibt

von bal (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> ..oOo.. schrieb:
> "Schön", dass C-Compiler solche schwachsinnigen Quellcodeformulierungen
> ohne Murren übersetzt, statt solchem verwirrenden Zeugs einen
> konsequenten Riegel vorzuschieben.
>
> Das ist Absicht!
> Der Gedanke dahinter ist der, daß sich nur halbwegs intelligente Leute
> damit auseinandersetzen und die grössten Deppen gar nicht mitspielen.
> Leider hat sich diese Hoffnung nicht erfüllt, sie geben trotzdem ihren
> Senf dazu.

Was stimmt denn mit dir nicht?
Du musst ein armer, verbitterter Mensch sein wenn du sowas am Feiertag 
Vormittag von dir gibst. Warum verbringst du die Zeit nicht mit deiner 
Familie, oder entspannst?
Du tust mir leid.

von Rolf M. (rmagnus)


Lesenswert?

..oOo.. schrieb:
> Noch einer schrieb:
>> Schönes Beispiel für den Obfuscated C Code Contest.
>
> "Schön", dass C-Compiler solche schwachsinnigen Quellcodeformulierungen
> ohne Murren übersetzt, statt solchem verwirrenden Zeugs einen
> konsequenten Riegel vorzuschieben.

Man könnte zwar für alles, was irgendwer als schwer lesbar einstufen 
könnte, spezielle Ausnahmeregeln definieren, die das unterbinden, aber 
das würde die Sprache komplexer machen, ohne daß Leute, die sowieso 
vernünftigen Code schreiben, etwas davon hätten.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:
> ..oOo.. schrieb:
>> Noch einer schrieb:
>>> Schönes Beispiel für den Obfuscated C Code Contest.
>>
>> "Schön", dass C-Compiler solche schwachsinnigen Quellcodeformulierungen
>> ohne Murren übersetzt, statt solchem verwirrenden Zeugs einen
>> konsequenten Riegel vorzuschieben.
>
> Man könnte zwar für alles, was irgendwer als schwer lesbar einstufen
> könnte, spezielle Ausnahmeregeln definieren, die das unterbinden, aber
> das würde die Sprache komplexer machen, ohne daß Leute, die sowieso
> vernünftigen Code schreiben, etwas davon hätten.

Vor allen Dingen sind solche Regeln gar nicht so einfach konsistent zu 
definieren.
Ist
1
    j=i+-3;
schwer zu lesen? Ist zwar Ansichtssache, aber ich würde mal ja sagen. 
Ist es legal? Natürlich ist es das. Wie könnte man es besser schreiben. 
Easy
1
    j = i + -3;

Ist
1
    len = sqrt(x*x + y*y);
schwer zu lesen? Ist zwar auch Ansichtssache, aber den Phythagoras wird 
wohl jeder hier erkennen. Habe ich aus dem ersten Beispiel die Lehre 
gezogen, dass eine Sprachregel her muss, wonach zwischen Operanden und 
Operator bei binären Operationen ein Whitespace stehen muss, dann zwinge 
ich damit den Programmierer das so zu schreiben
1
    len = sqrt( x * x + y * y );
Jetzt kann man natürlich debattieren, welche Lösung die besser lesbare 
sei. Ich würde trotzdem sagen die erste. Denn dort ist der optische 
Zusammenhang der Quadrate leichter zu sehen, was in der zweiten Lösung 
nicht der Fall ist. Klar, ich kann natürlich auch
1
    len = sqrt( ( x * x ) + ( y * y ) );
schreiben. Aber ist diese Version in der Schreibweise wirklich besser 
als die erste? Länger ist sie auf jeden Fall.

Fazit: man kann in jeder Sprache unleserliche Programme schreiben. Das 
ist keineswegs nur auf C beschränkt. Man kann - aber man muss nicht. Das 
es in C natürlich einen Haufen Sonderzeichen gibt, deren Bedeutung man 
kennen und lernen muss, ist unbestritten. Aber dazu lernt man ja auch 
eine Sprache und geht nicht mit Achtelwissen in reale Projekte rein. Das 
muss man schliesslich in jeder Sprache (bis auf die Auswanderer, die 
ohne ein Wort Schwedisch zu können nach Schweden auswandern. Aber das 
ist nicht das Problem der Schweden und eine andere Geschichte)

: Bearbeitet durch User
von Gaestchen (Gast)


Lesenswert?

Karl Heinz schrieb:

> len = sqrt( x * x + y * y );

Der Programmierer aus dem erstem Beispiel würde es wohl so schreiben:

 len = sqrt( x * x+y * y );

Wenn man gezielt Leser verwirren will kann man das wohl in jeder 
Sprache.

von Markus (Gast)


Lesenswert?

Hi,

Karl Heinz schrieb:
> Habe ich aus dem ersten Beispiel die Lehre
> gezogen, dass eine Sprachregel her muss, wonach zwischen Operanden und
> Operator bei binären Operationen ein Whitespace stehen muss

Whitespaces sind nicht Sprachbestandteil. Die werden durch die 
lexikalische Analyse herausgefiltert, der es egal sein muß, wieviele 
Whitespaces wo stehen, da sie nur Token zu bilden hat. Es müßte also 
bereits vor der lexikalische Analyse eine solche Regel angewendet 
werden. Tools zu ihrer Überwachung gibt es, z.B. Checkstyle. Code 
Formatter, Beautifier, Pretty Print gibt es auch.

Grüße, Markus

von Lukas K. (carrotindustries)


Lesenswert?

Auch wunderbar zum Verwirrung stiften geeignet: Der 'downto'-Operator ;)
1
int i = 10;
2
while(i --> 0) {
3
    ....
4
}

von Rolf M. (rmagnus)


Lesenswert?

Markus schrieb:
> Whitespaces sind nicht Sprachbestandteil.

Stroustrup hatte dazu mal eine Idee ;-)
http://www.stroustrup.com/whitespace98.pdf

von lalala (Gast)


Lesenswert?

Karl Heinz schrieb:
> abe ich aus dem ersten Beispiel die Lehre
> gezogen, dass eine Sprachregel her muss, wonach zwischen Operanden und
> Operator bei binären Operationen ein Whitespace stehen muss

Wie wäre es damit, die Lehre zu ziehen, dass vor unären Operatoren ein 
Leerzeichen stehen sollte (und -3 sollte als unärer Operator angewandt 
auf 3 interpretiert werden :-) )

von Bastler (Gast)


Lesenswert?

> Stroustrup hatte dazu mal eine Idee ;-)
> http://www.stroustrup.com/whitespace98.pdf
Was hatte der denn geraucht, bevor er das geschrieben hat.

von Yalu X. (yalu) (Moderator)


Lesenswert?

lalala schrieb:
> Wie wäre es damit, die Lehre zu ziehen, dass vor unären Operatoren ein
> Leerzeichen stehen sollte

Das passt leider auch nicht immer:
1
a = * *pointer:

statt
1
a = **pointer:

sieht zumindest für meine Augen sehr ungewohnt aus.

Die Regel, vor und nach binären Operatoren ein Leerzeichen zu schreiben,
ist schon in Ordnung, wenn man in speziellen Fällen (wie bspw. der
obigen Formel des Pythagoras) Ausnahmen im Sinne der besseren Lesbarkeit
zulässt.

Guten Stil kann man nicht mit starren Regeln definieren.


Markus schrieb:
> Whitespaces sind nicht Sprachbestandteil.

Doch. Sonst wären folgende Programmzeilen äquivalent:
1
interna = 5;
2
int erna = 5;

Sei sind es aber nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lukas K. schrieb:
> Auch wunderbar zum Verwirrung stiften geeignet: Der 'downto'-Operator ;)

Der ist hübsch, den kannte ich noch nicht. :)  Kann man natürlich
mit einem #define noch würzen:
1
#define downto -->
2
3
...
4
5
int i = 10;
6
while(i downto 0) {
7
    ....
8
}

Bastler schrieb:
>> Stroustrup hatte dazu mal eine Idee ;-)
>> http://www.stroustrup.com/whitespace98.pdf
> Was hatte der denn geraucht, bevor er das geschrieben hat.

Vielleicht guckst du ja mal aufs Datum?

von Markus (Gast)


Lesenswert?

Hi,

Yalu X. schrieb:
> Doch. Sonst wären folgende Programmzeilen äquivalent:
> interna = 5;
> int erna = 5;
>
> Sei sind es aber nicht.
mag man so sehen, aber eine Sprache besteht aus Worten. Wie die Worte 
gebildet werden, definiert die Sprache m.W.n. aber nicht. Die 
Wortbildung setzt m.E. vor dem Punkt an, wo eine Sprache beginnt.

Grüße, Markus

von Rolf M. (rmagnus)


Lesenswert?

Markus schrieb:
> Wie die Worte gebildet werden, definiert die Sprache m.W.n. aber nicht.

Wer denn sonst?

Yalu X. schrieb:
> lalala schrieb:
>> Wie wäre es damit, die Lehre zu ziehen, dass vor unären Operatoren ein
>> Leerzeichen stehen sollte
>
> Das passt leider auch nicht immer:
> a = * *pointer:
>
> statt
> a = **pointer:
>
> sieht zumindest für meine Augen sehr ungewohnt aus.

Schlimmer wird das noch, wenn man davor eine Multiplikation hat:
1
a = 3 * * *pointer;

Man könnte Klammern setzen, aber da stören die Leerzeichen auch eher:
1
a = 3 * ( * *pointer);

lalala schrieb:
>(und -3 sollte als unärer Operator angewandt auf 3 interpretiert werden :-) )

Das wird es in C sowieso schon.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Yalu X. schrieb:
>> Whitespaces sind nicht Sprachbestandteil.
>
> Doch. Sonst wären folgende Programmzeilen äquivalent:interna = 5;
> int erna = 5;
>
> Sei sind es aber nicht.

Geht auch ohne whitespace. ;-)
1
int/**/erna=5;

von Sebastian V. (sebi_s)


Lesenswert?

Bastler schrieb:
>> Stroustrup hatte dazu mal eine Idee ;-)
>> http://www.stroustrup.com/whitespace98.pdf
> Was hatte der denn geraucht, bevor er das geschrieben hat.

Spätestens beim Einführen von impliziten Whitespace Operatoren und 
Variablennamen die aus einem Unicode Zeichen bestehen sollte man 
bemerken, dass er das nicht ernst meinen kann.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sebastian V. O. schrieb:
> Spätestens beim Einführen von impliziten Whitespace Operatoren und
> Variablennamen die aus einem Unicode Zeichen bestehen sollte man
> bemerken, dass er das nicht ernst meinen kann.

Bei den Whitespace-Operatoren hast du recht, aber Unicode-Zeichen in
Variablennamen sind mittlerweile in ziemlich vielen Programmiersprachen
erlaubt (darunter Java, Python, Ruby, Tcl, D, Haskell, Rust, Scala,
Swift und mit Einschränkungen auch C und C++):

  http://rosettacode.org/wiki/Unicode_variable_names

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.