i++ =i+1 ?

  • hi
    hab ein würfelprogramm (ab)geschrieben .funst eigentlich ohne probleme.


    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>


    using namespace std;


    int main(void)


    {
    int i,a;

    srand(time(NULL));
    printf("gewürfelt:\n");
    for (i=1;i<=5;i++) {
    a=rand()%6+1;
    printf("%2d.Wurf: %d\n",i,a);
    }
    system("PAUSE");
    return EXIT_SUCCESS;


    als ich etwas drin rumgepfuscht habe (zum lernen),ist mir was aufgefallen.
    wenn ich i++ in i+1 ändere zählt i nicht mehr hoch.das sollte doch eigentlich der fall sein?


    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>


    using namespace std;


    int main(void)


    {
    int i,a;

    srand(time(NULL));
    printf("gewürfelt:\n");
    for (i=1;i<=5;i+1) {
    a=rand()%6+1;
    printf("%2d.Wurf: %d\n",i,a);
    }
    system("PAUSE");
    return EXIT_SUCCESS;


    mit was kann man i++ gleich setzen bzw was muß ich alternativ schreiben
    das das funst?


    mfg

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)

  • wie schon gesagt:
    i=i+1 sollte es heißen ... mit einem reinen "i+1" kommste nicht weit. Du musst den wert ja der variablen zuweisen.

    VDR:
    Hardware: Asus AT5IONT-I // 1024MB Kingston ValueRAM PC3-8500 // Samsung F3 Ecogreen 1000GB // TBS 6920
    Software: Ubuntu 10.04 LTS // s2-liplianin // vdr-1.7.16 // xbmc

    Einmal editiert, zuletzt von vyu ()

  • hi
    vielen danke (bin ich dumm, hätte ich auch selbst drauf kommen können)


    "Und warum nimmst Du nicht i++ ?"
    i++ zählt ja nur immer 1 dazu wenn ich aber 2 dazuzählen will kann ich ja
    nich i+++ nehmen (selbst wenn es so wäre wäre das bei 100 recht lästig).


    mfg

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)

  • Da lobe ich mir das gute alte Pascal, wo es einfach immer heißt:


    i := i + 1;


    Was nützen einem dutzende andere Schreibweisen à la "i++" oder "i+=10", wenn sie am Ende nur verwirren? Wirklich einleuchtend (auch für Außenstehende) ist doch nur die ausführliche Schreibweise.

  • Hey ArneH...


    was bedeutet doch gleich der Doppelpunkt da????


    Heheeee..... Sorry einfach ignorieren!!! :lol2


    ciao jfr

    Hardware: Antec Fusion Remote; Asus M4N68T; 4GB Ram; 2TB HD; TT1.5
    Software: yaVDR 0.5

  • Zitat

    "Und warum nimmst Du nicht i++ ?" i++ zählt ja nur immer 1 dazu wenn ich aber 2 dazuzählen will kann ich ja nich i+++ nehmen (selbst wenn es so wäre wäre das bei 100 recht lästig).


    Schweinkram: i += i++


    Geht alles.

    - HTPC mit zerbasteltem Yavdr 0.6 , Origen ae X15e, MCE Remote, Asus P5N7A-VM, 1x Digibit R1, Kodi und vdr an Pana 46PZ85E
    - Diverse HTPCs im Umfeld bei Familie und Freundenm die sich vor mir fürchten, mit allen möglichen gruseligen Konfigurationen.
    Auch gern Debian, aber wehe jemand kommt mir mit Suse.

  • Zitat

    Original von jfr
    was bedeutet doch gleich der Doppelpunkt da????


    Macht den Unterschied zwischen Vergleich = und Zuweisung := deutlicher als bei C. Damit gibt es weniger Typos a la

    Code
    if (a = b)
    {
    
    
    }


    anstelle von


    Code
    if (a == b)
    {
    
    
    }
  • Zitat

    Original von Hibbelharry
    Schweinkram: i += i++


    Noch lustiger: i+=++i;
    :rolleyes:

    VDR1: AMD Duron-1300, 512mb RAM, Nexus-S rev2.1, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    VDR2: Athlon XP-M-2600+, 512mb RAM, TT Prem 1.3 DVB-S, Skystar2, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    Extern: Activy300, Gen2VDR V2

  • Zitat

    Original von ArneH
    Was nützen einem dutzende andere Schreibweisen à la "i++" oder "i+=10", wenn sie am Ende nur verwirren?


    Je nach verwendetem Compiler und Architektur ist i++ schneller als i = i + 1. Zudem wird im Data Segment des Programms bis zu 4 Byte gespart ;)

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

  • Zitat

    Original von pinky666
    Je nach verwendetem Compiler und Architektur ist i++ schneller als i = i + 1. Zudem wird im Data Segment des Programms bis zu 4 Byte gespart ;)


    Je nach verwendetem Compiler dürfte inzwischen _jeder_ Compiler, der halbwegs aktuell ist, für beides auf allen Architekturen identischen Code, nämlich den schnellsten möglichen, erzeugen. Deshalb wähle man einfach diejenige Variante, die das gewünschte am besten ausdrückt.


    Und die (semantisch) schnellere Variante wäre, wenn, dann ++i und nicht i++, weil bei ersterem der alte Wert von i nicht konserviert werden muss. Und wo die vier Bytes verlorengehen, müsstest Du mir erklären :)

  • Zitat

    Original von LordJaxom


    Beides undefiniert. :p


    Das halte ich für ein Gerücht. Beides ist zulässig und korrekt.


    Wahrscheinlich ist es allerdings ein Entlassungsgrund, wenn jemand so programmiert. :D


    CU
    Oliver

  • Zitat

    Original von UFO


    Das halte ich für ein Gerücht. Beides ist zulässig und korrekt.


    Wahrscheinlich ist es allerdings ein Entlassungsgrund, wenn jemand so programmiert. :D


    Alles schon gesehen. Zu Zeiten, als Speicher noch ein mittleres Vermögen kostete und von den Prozessoren die Bytes noch ziemlich langsam hin und her geschoben wurden, wurde beim coden auf jedes Byte Ersparnis und möglichen Gewinn an Performance Wert gelegt.
    Treten solche Zeilen geballt auf, braucht man sich über die Wartbarkeit keine großen Gedanken mehr machen. :schiel


    Ist aber alles eine Frage der Einstellung :unsch

    VDR1: AMD Duron-1300, 512mb RAM, Nexus-S rev2.1, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    VDR2: Athlon XP-M-2600+, 512mb RAM, TT Prem 1.3 DVB-S, Skystar2, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    Extern: Activy300, Gen2VDR V2

  • Hi,


    da ja bald Weihnachten ansteht, noch etwas für Freunde "schöner" C-Programme
    (stammt nicht von mir, Irgendwo im Netz gefunden):



    :lol2


    CU
    Oliver

  • Zitat

    Original von LordJaxom
    Je nach verwendetem Compiler dürfte inzwischen _jeder_ Compiler, der halbwegs aktuell ist, für beides auf allen Architekturen identischen Code, nämlich den schnellsten möglichen, erzeugen. Deshalb wähle man einfach diejenige Variante, die das gewünschte am besten ausdrückt. Und die (semantisch) schnellere Variante wäre, wenn, dann ++i und nicht i++, weil bei ersterem der alte Wert von i nicht konserviert werden muss.


    Da gebe ich Dir volllkommen recht. Jedoch sollte man sich dieser Tatsache bewusst sein. Und genau das wollte ich Damit sagen. Die beiden Ausdrücke sagen etwas unterschiedliches aus, egal was der Compiler draus macht.

    Zitat


    Und wo die vier Bytes verlorengehen, müsstest Du mir erklären :)


    Nun, wenn ich davon ausgehe das der Compiler eben nicht diese Optimierung durchführt, muss die eins ja irgendwo gespeichert werden, oder nicht ?

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

    Einmal editiert, zuletzt von pinky666 ()

  • Zitat

    Original von UFO
    Hi,


    da ja bald Weihnachten ansteht, noch etwas für Freunde "schöner" C-Programme
    (stammt nicht von mir, Irgendwo im Netz gefunden).


    :cool1 das kannte ich nicht.


    Für alle die keinen C-Compiler zur Hand haben die Ausgabe des Codes im Anhang und alle singen mit :].

    Dateien

    VDR1: AMD Duron-1300, 512mb RAM, Nexus-S rev2.1, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    VDR2: Athlon XP-M-2600+, 512mb RAM, TT Prem 1.3 DVB-S, Skystar2, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    Extern: Activy300, Gen2VDR V2

  • Zitat

    Originally posted by pinky666
    Nun, wenn ich davon ausgehe das der Compiler eben nicht diese Optimierung durchführt, muss die eins ja irgendwo gespeichert werden, oder nicht ?


    Das ist Scope Analysis und hat mit der Peephole-Optimierung i=i+1 -> ++i nix zu tun.


    Ob das eine Optimierung ist oder nicht, haengt uebrigens sehr vom Prozessor ab. Aktuell werden Laufvariablen bevorzugt wieder mit add und sub statt mit inc und dec gezählt, weil zwar formal beide gleich schnell sind, letztere aber das Carry nicht beeinflussen und damit auf Intel zu einem partial flags stall und generell zu einer false dependency führen können. Es sei denn, der Compiler optimiert auf Größe oder weiss, dass diese Situation hier nicht auftritt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!