Permalänk
Medlem

C == C++

Någon annan som slagits av ironin i att C == C++?

Uppenbarelsen kom till mig under nattens programmeringssession.

Permalänk
Medlem

mjae...det är väl inte helt sant??
Allt som du kan göra i C kan du göra i C++ men inte tvärtom.
Eller??

Visa signatur

schack rules, i don't...:-(

Permalänk
Medlem

c är inte lika som c++ sist jag kollade, man skriver lite olika, man kan göra lite mer bättre saker i c++.
precis som ++ gör, det är c+1 den är nyare

Visa signatur

Maximus X Hero - 8700k @5.1GHz - H115i - 32GB LPX@3466MHz - MSI 980Ti Gaming - EVGA SuperNova 750 G2 - Asus vg248qe - FD R5

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av taimanov
mjae...det är väl inte helt sant??
Allt som du kan göra i C kan du göra i C++ men inte tvärtom.
Eller??

Han syftar mer på den specifika koden -

C == C++;

Vilket är helt sant.

Permalänk
Medlem
Permalänk
Avstängd

Jag fattar inte den kodraden, kan nån förklara varför den är sann?

Permalänk
Medlem

Variabeln C är lika med sig själv, sedan räknas variablen C upp med 1 (men den är ju ändå lika med sig själv även efter detta).

Fattade jag rätt?

Permalänk
Medlem

Jag fattar inte hur en variabel kan vara lika med sig själv plus 1? Det är ju som att jämföra 0 == 1, solklart false ju. Eller vad menas med detta?

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
Medlem

Man skulle kunna skriva koden typ:
C == C;
C++;

bara att hans version är konkatenerad till C == C++;
För C är alltid lika med C, oavsett värdet av C

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Medlem

Så här är det: När C == C++ evalueras så kommer två saker att ske. Först sker jämförelsen C == C som evalueras till true, och sedan så sker beräkningen C++ som ger resultatet C+1. Däremot så kommer C == ++C evalueras till false för då sker beräkningen innan jämförelsen.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ChristofferC
Så här är det: När C == C++ evalueras så kommer två saker att ske. Först sker jämförelsen C == C som evalueras till true, och sedan så sker beräkningen C++ som ger resultatet C+1. Däremot så kommer C == ++C evalueras till false för då sker beräkningen innan jämförelsen.

Vet inte om det gör någon skillnad igentligen. C == ++C skulle väl kunna skrivas:

C++; C == C;

eller är det jag som tänker helt fel? För om man ändrar värdet på C så ändras det för alla C, inte bara den som ska ökas värdet på då de är alla samma variabel.

Edit:
Bestämde mig för att testa (I C++):

#include <iostream> using namespace std; int main() { int c; if ( c == c++ ) { cout << "Iz troo!\n"; } else { cout << "Iz faaals!\n"; } if ( c == ++c ) { cout << "Iz troo!\n"; } else { cout << "Iz faaals!\n"; } return 0; }

resulterar i:
Iz faaals!
Iz troo!
o.O
Edit2:
Jag som tänkte fel, glömde lägga tillbaka ++c och c++, blir samma resultat även fast man initializerar variabeln innan

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Medlem

Ingen av er har helt rätt. Både prefix versionen ++c och postfix versionen c++ har högre prioritet än == operatorn, alltså båda evaluerar ++ operatorn innan likhets testet.

c == (c++)

respektive

c == (++c)

Skillnaden ligger i att prefix operatorn ++c inkrementerar c _innan_ det returneras medans postfix operatorn c++ inkrementerar värdet _efter_ det har returnerats. Observera att värdet på variablen c kommer vara lika oavsett vilken operator du använder. Det blir tydligare om man tittar på hur de två operatorerna skulle kunna implementeras för en klass.

// prefix version (++c)
class& operator++()
{
*this = *this + 1;
return *this;
}

// postfix version (c++)
class operator++(int)
{
class tmp = *this;
*this = *this + 1;
return tmp;
}

Notera att postfix versionen använder en temp variabel för att spara värdet på variablen innan den inkrementeras varefter temp variablen returneras. Det här är också en anledning till att det är snabbare att använda ++c istället för c++ i t.ex. for-loopar.

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sunefred
Ingen av er har helt rätt. Både prefix versionen ++c och postfix versionen c++ har högre prioritet än == operatorn, alltså båda evaluerar ++ operatorn innan likhets testet.

Kunde ge mig tusan på att jag skulle få nåt fel när jag försökte besserwissra lite. Självklart har ++ högre prioritet än ==

Permalänk
Medlem

Att ++ har högre prioritet än == betyder inte nödvändigtvis att c == ++c, då ordningen som argument evalueras är ospecificerat i C++. Det beror alltså på i vilken ordning argumenten evalueras. ++ kommer att evalueras före ==, men c skulle kunna evalueras före ++c, vid vilket c != ++c.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Det där var högre teoretisk programmering än vad jag har hållit på med hittils, jag är enbart självlärd tyvärr Försöker hitta böcker angående detta som jag kan läsa igenom.

Tack för rättningen iaf, och så har man lärt sig någonting nytt också

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sunefred
Ingen av er har helt rätt. Både prefix versionen ++c och postfix versionen c++ har högre prioritet än == operatorn, alltså båda evaluerar ++ operatorn innan likhets testet.

Så pinsamt av mig att inte kolla upp bättre innan jag skapade en tråd om ämnet, men precis som lajnod skrev så har det ju att göra med vilken ordning kompilatorn evaluerar operanderna (förutsatt ett det inte står i specifikationen). Jag antog att det var från vänster till höger men om det är omvänt så har du givetvis rätt.

Lyckligtvis går missen att korrigera: Om operanderna evalueras från höger till vänster får vi uttrycket C > C++, som i min mening är minst lika ironiskt.

Vi kan till och med skapa ett uttryck som stämmer oavsett vilken ordning operanderna utvärderas: C >= C++

Ironin är räddad!

PS. Synd att == är det alternativ som ser bäst ut.

Permalänk
Medlem

Måste nog förtydliga mig lite

Diodonk:

Det ursprungliga uttrycket C == C++ borde mycket riktigt evaluera till SANT.

Sen, blir jag lite osäker på vad ni menar med att ordningen på operanderna inte är specificerad. Operander==operatorer eller? (såsom +, -, *, ++, =, ==, != osv)? Operator-ordningen är väl specificerad, det kallas operator precedence. Här finns en lista

http://www.cppreference.com/wiki/operator_precedence

Operatorerna högst upp i denna lista har högst prio och kompilatorn kommer därmed evaluera dessa först. Notera att c++ har prio 2, ++c har prio 3 och == har prio 9. För att förtydliga kan man sätta paranteser.

c == c++

blir då

( c == (c++) )

Sen vad gäller prefix vs postfix så evaluerar de alltså till följande (se tidigare inlägg)

(c++) => (c)
(++c) => (c+1)

Eftersom du använder dig av det första så är ditt uttryck mycket riktigt sant.

Är jag helt ute och cyklar här? Är det något annat ni menar?

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sunefred
...

Se "==" som en funktion som tar två parametrar istället. Evalueringsordningen av parametrarna är inte väldefinerad i C++.

#include <cstdio> using namespace std; struct Object { Object(int data = 0) : data(data) { } Object operator++(int) { return Object(data++); } int data; }; bool operator==(const Object& lhs, const Object& rhs) { return (lhs.data == rhs.data); } int main() { Object C; if(C == C++) printf("==\n"); else printf("!=\n"); return 0; }

MSVC 2010 ger "!=" för kodsnutten ovan.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sunefred
Sen, blir jag lite osäker på vad ni menar med att ordningen på operanderna inte är specificerad.

[...]

Är jag helt ute och cyklar här? Är det något annat ni menar?

Ursäkta otydligheten. Vad jag menar kan enkelt förtydligas såhär:

int C = 123; int foo() { return C; } int bar() { int temp = C; C += 1; return temp; }

Om vi nu vill utvärdera uttrycket foo() == bar()

Kommer foo() att anropas och utvärderas före bar() eller vice versa?

Om den vänstra sidan dvs. foo() utvärderas först så får vi jämförelsen 123 == 123, plus att C därefter är 124.

Om istället den högra sidan dvs. bar() utvärderas först så får vi jämförelsen 124 == 123 eftersom C ökas med ett innan foo() anropas. C får även här värdet 124.

Hoppas det blev mer begripligt.

Permalänk
Medlem

Tack båda två för bra förklaringar. Nu hänger jag med också Har aldrig reflekterat över att evalueringsordningen av höger respektive vänster operand kan ha betydelse. Uppenbarligen ett grymt exempel som kräver förståelse av ett flertal detaljer i språket. Borde funka väl som en kuggfråga på någon tenta!

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Medlem

Efter lite efterforskningar så visar det sig att varken C eller C++ specificerar någon ordning att utvärdera operanderna i, förutom för vissa operatorer.

Uttrycket C >= C++ är dock sant för alla C mindre än variabelns maxvärde, detta oavsett vilken ordning operanderna evalueras.

För den intresserade: http://en.wikipedia.org/wiki/Sequence_point

Permalänk
Medlem

Spännande..

testade denna kodsnutten som shenjin hade med "g++ -Wall filnamn.cpp"

och fick:
Iz troo!
Iz troo!

Fast jag fick några varningar av kompilatorn som hintar mig att min kod inte är helt nykter

Citat:

apa.cpp:8: warning: operation on ‘c’ may be undefined
apa.cpp:13: warning: operation on ‘c’ may be undefined

Fast testade jag Weeblies variant med Objekt så fick jag "!=" och inga varningar så det är lite märkligt att kompilatorn inte hintar mig att jag borde tänka över min kod.

EDIT:
Ännu mer spännande är att ifall man ändrar Weeblies kod till detta:

... Object C; Object D; if(C == D++) ...

Så får man "=="

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Weeblie
Se "==" som en funktion som tar två parametrar istället. Evalueringsordningen av parametrarna är inte väldefinerad i C++.

#include <cstdio> using namespace std; struct Object { Object(int data = 0) : data(data) { } Object operator++(int) { return Object(data++); } int data; }; bool operator==(const Object& lhs, const Object& rhs) { return (lhs.data == rhs.data); } int main() { Object C; if(C == C++) printf("==\n"); else printf("!=\n"); return 0; }

MSVC 2010 ger "!=" för kodsnutten ovan.

Fast är inte ditt C++ motsvarande ett ++C för int? Bör det inte vara såhär?

Object operator++(int) { Object r = Object(data); ++data; return r; }

Visa signatur

The variable 'brain' is declared but never used

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av damme
Fast är inte ditt C++ motsvarande ett ++C för int? Bör det inte vara såhär?

Object operator++(int) { Object r = Object(data); ++data; return r; }

Kodsnutten som jag postade gör exakt det också.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Weeblie
Kodsnutten som jag postade gör exakt det också.

D'oh. *Slå sig själv i skallen*

Visa signatur

The variable 'brain' is declared but never used

Permalänk
Medlem

I matte D/E så är C en konstant. Så om C är F(x)=x^2+2x+C så är C==C++ för C är en konstant och blir alltid 0. F(x)=x^2+2x+C f´(x)=2x+x+0;

Det är min lösning till att C=C++

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Jimicro
I matte D/E så är C en konstant. Så om C är F(x)=x^2+2x+C så är C==C++ för C är en konstant och blir alltid 0. F(x)=x^2+2x+C f´(x)=2x+x+0;

Det är min lösning till att C=C++

Den konstanten C du pratar om är inte alltid 0!

Visa signatur

May the source be with you

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av MrHawkan
Den konstanten C du pratar om är inte alltid 0!

C kan vara vad som helst, men när man deriverar C blir den 0, men oftast skriver inte ut nånting

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Avstängd

Hmmm... Obegripligt, Jimicro.

För övrigt så är det omöjligt att ett tal x == x++, pga Peanos axiomsystem.

Permalänk
Medlem

c == c++, false
c == ++c, true
c += c++, true
c >= c++, true

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S