BSDForen.de  

Zurück   BSDForen.de > Geekstuff > Programmieren

Antwort
 
Themen-Optionen Thema bewerten Ansicht
Alt 07.08.2012, 14:55   #1
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 994
Herakles eine Nachricht über ICQ schicken
Question [C]lvalue required bei Präinkrement

Moin!

Kurz und knapp: Warum geht das hier nicht?

Code:
int main(void){ int i; ++i %= 5; return 0; }
Compiler meldet, dass er eine "lvalue" erwartet, sie aber nicht bekommt.

Wo ist dieser Code unlogisch und fehlerhaft?

Danke im Voraus sagt der Neugierige
Herakles
Herakles ist offline   Mit Zitat antworten
Alt 07.08.2012, 15:17   #2
thorsten1
Registered User
 
Registrierungsdatum: Jul 2004
Beiträge: 117
Ich würde mal tippen, dass der Präinkrement-Operator den um Eins erhöhten Wert von i als Konstante liefert. Und dieser Konstante kannst Du mit %= natürlich keinen neuen Wert zuweisen.

Evtl. mal den Postinkrement-Operator probieren, oder noch besser: Das Ganze in zwei Anweisungen schreiben. Also erst inkrementieren, dann den Divisionsrest zuweisen. Ein weiterer Vorteil ist, dass man dann auch die Woche drauf noch den eigenen Code versteht. ;-) Und Variablen am besten gleich bei der Erzeugung mit einem definierten Wert belegen.
thorsten1 ist offline   Mit Zitat antworten
Alt 07.08.2012, 18:07   #3
s-tlk
Lion King Fan
 
Benutzerbild von s-tlk
 
Registrierungsdatum: May 2004
Ort: Pride Rock
Beiträge: 1.331
Ich glaube das ist egal, denn "++i" steht ja fuer "i = i + 1", wobei bei "++i" "i" zurueckgegeben wird und bei "i++" "i + 1", was beides rvalues sind, denen man wie du schon sagtest nichts zuweisen kann.

Vllt warten wir da auch mal auf Tron, der ist doch unser Compiler Experte.
__________________
HP: Simba - The Lion King
s-tlk ist offline   Mit Zitat antworten
Alt 07.08.2012, 22:05   #4
Frank
Anfänger
 
Registrierungsdatum: Sep 2003
Ort: Bergisch Gladbach
Beiträge: 280
Frank eine Nachricht über ICQ schicken
++i ist kein L-Value (hat keine Speicheradresse)


und noch eine Kleinigkeit:
i ist nicht initialisiert -> undefiniertes Verhalten Festplatte könnte formatiert werden
Frank ist offline   Mit Zitat antworten
Alt 07.08.2012, 23:01   #5
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.658
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Zitat:
Zitat von Frank Beitrag anzeigen
und noch eine Kleinigkeit:
i ist nicht initialisiert -> undefiniertes Verhalten Festplatte könnte formatiert werden
Ähm ... nein.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 07.08.2012, 23:13   #6
hades
the unseen one
 
Benutzerbild von hades
 
Registrierungsdatum: Dec 2006
Ort: Biberach an der Riß
Beiträge: 461
Zitat:
Zitat von Frank Beitrag anzeigen
i ist nicht initialisiert -> undefiniertes Verhalten Festplatte könnte formatiert werden
Das ist so nicht richtig. In einem der C-Standards (ich glaube es ist C99, Tron weiß das sicherlich genauer) ist festgelegt, dass nicht explizit initialisierte Variablen implizit mit 0 initialisiert werden.
__________________
Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen.
(E. Kästner)
hades ist offline   Mit Zitat antworten
Alt 08.08.2012, 05:56   #7
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.658
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Egal welchen C-Standard man nimmt. Es ist vollkommen egal was in i steht. In der konkreten Anwendung birgt eine uninitialisierte Variable keine Gefahr.

Ich schreibe in der Regel immer noch ANSI-C und habe keine Ahnung was so in C99 passiert. Ich verwende auch Erweiterungen wie Enums nicht, weil ich Enums ohne Typsicherheit mächtig sinnlos finde.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 08.08.2012, 06:32   #8
Frank
Anfänger
 
Registrierungsdatum: Sep 2003
Ort: Bergisch Gladbach
Beiträge: 280
Frank eine Nachricht über ICQ schicken
Zitat:
Zitat von hades Beitrag anzeigen
Das ist so nicht richtig. In einem der C-Standards (ich glaube es ist C99, Tron weiß das sicherlich genauer) ist festgelegt, dass nicht explizit initialisierte Variablen implizit mit 0 initialisiert werden.
Wenn sie gloabl sind.

An die "Styleguides" an die ich mich halten muss/will steht: immer initialisieren.
Mir ist es lieber.
Aber das ist sicher auch alles eine Geschmacksfrage.
Frank ist offline   Mit Zitat antworten
Alt 08.08.2012, 06:59   #9
Frank
Anfänger
 
Registrierungsdatum: Sep 2003
Ort: Bergisch Gladbach
Beiträge: 280
Frank eine Nachricht über ICQ schicken
Boa....bin zu doof auf die schnelle was im Standard dazu zu finden.
Warte jetzt auch mal auf Tron
Frank ist offline   Mit Zitat antworten
Alt 08.08.2012, 12:25   #10
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 994
Herakles eine Nachricht über ICQ schicken
Kurz am Rande zu dem Exkurs in Richtung "nicht initialisiert". Ich hab den Code hier einfach in das Editierfenster geschrieben und dabei habe ich einen Flüchtigkeitsfehler gemacht. Bitte geht davon aus, das im obigen Code

Code:
int i=0;
steht. Ihr Erbsenzähler!

Grüße
Herakles
Herakles ist offline   Mit Zitat antworten
Alt 08.08.2012, 12:41   #11
Frank
Anfänger
 
Registrierungsdatum: Sep 2003
Ort: Bergisch Gladbach
Beiträge: 280
Frank eine Nachricht über ICQ schicken
Das hatte ich mir schon gedacht.

Drum auch das mit der Festplatte löschen
(der Vergleich ist aber aus einem C++ Buch von Scott Meyers)
Frank ist offline   Mit Zitat antworten
Alt 09.08.2012, 08:39   #12
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.658
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Zitat:
Zitat von Frank Beitrag anzeigen
Drum auch das mit der Festplatte löschen
(der Vergleich ist aber aus einem C++ Buch von Scott Meyers)
Das spricht gegen das Buch.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 09.08.2012, 09:15   #13
Yamagi
Possessed With Psi Powers
 
Benutzerbild von Yamagi
 
Registrierungsdatum: Apr 2004
Ort: Schleswig-Holstein
Beiträge: 6.597
Yamagi eine Nachricht über ICQ schicken
Naja, kommt halt drauf an, wo man sich befindet. Unter richtigen Betriebssystemen sollte das Rechtemanagement tunlichst verhindern, dass so etwas passiert. Zumindest solange man im Userland ist. Aber unter primitiven Systemen wie DOS ist es durchaus denkbar. Rein theoretisch gesprochen, ich bezweifele, dass ein im undefinierten Bereich arbeitendes Programm wirklich mal eine Festplatte gelöscht hat.
__________________
Eure Tastatur verfügt nicht umsonst über zwei Shift-Tasten! Benutzt sie bitte, denn sonst ist es mir fast unmöglich euere Posts zu entziffern.

Yamagi ist offline   Mit Zitat antworten
Alt 09.08.2012, 11:28   #14
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 994
Herakles eine Nachricht über ICQ schicken
Back to topic, please!

Ich finde das "andere" Thema zwar auch interessant, aber warum macht ihr dafür nicht fix nen neuen Thread auf? das wäre nett...

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 09.08.2012, 13:59   #15
Tron
Registered User
 
Registrierungsdatum: Apr 2004
Beiträge: 268
Jeder Operator in C liefert ein Ergebnis, manche haben auch Nebenwirkungen (Zuweisung: Wert einer Variablen ändern, Funktionsaufruf: quasi beliebiges im Speicher ändern). Dieses Ergebnis ist bis auf wenige Ausnahmen immer ein rvalue. Diese Ausnahmen sind Variablen, unärer *, [], . und -> (und seit C99 auch compound literals). Nur diese Ausdrücke liefern einen lvalue, also etwas, an das zugewiesen werden kann (alle Varianten der Zuweisung) oder von dem die Adresse bestimmt werden darf (unäres &).
Selbst wenn ++i einen lvalue liefern würde, dann wäre das Verhalten von ++i %= 5; undefiniert, da zwischen zwei aufeinanderfolgenden Sequenzpunkten (hier Anfang und Ende der Anweisung) das selbe Objekt mehrfach modifiziert werden würde.

Zitat:
Zitat von s-tlk Beitrag anzeigen
Ich glaube das ist egal, denn "++i" steht ja fuer "i = i + 1", wobei bei "++i" "i" zurueckgegeben wird und bei "i++" "i + 1", was beides rvalues sind, denen man wie du schon sagtest nichts zuweisen kann.
++i heißt nicht umsonst Präinkrement: Erst Variable um eins erhöhen, dann den neuen Wert zurückgeben. i++ erhöht auch den Wert von i um eins, aber liefert den vorherigen Wert von i.
Tron ist offline   Mit Zitat antworten
Antwort


Dieses Thema betrachten zurzeit 1 Personen. (0 registrierte Benutzer und 1 Gäste)
 
Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus
Gehe zu

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
Oracle Instant Client Version MASTEQ FreeBSD - Anwendungen und Ports 15 05.11.2009 13:04
version FBSD_1.1 required Herrmann FreeBSD - Installation 7 05.10.2008 21:19
Grafik und Soundprobleme Bomba FreeBSD - Installation 6 25.07.2007 23:49
Postfix + SASLv2 + MySQL + Courier-IMAP Bummibaer FreeBSD - Anwendungen und Ports 42 05.01.2005 22:39
Postfix, Courier-Imap, mit Sasl2 und MySQL Authentifizierung vanedler FreeBSD - Anwendungen und Ports 4 26.12.2004 13:41


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.


Powered by vBulletin (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.