Problem med en "else if" sats, kan vara mer...

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

Problem med en "else if" sats, kan vara mer...

Här länkar jag koden, så att ni kanske ser vad felet är:

#include <iostream> #include <iomanip> using namespace std; int main() { setlocale(LC_ALL, "sv_SE.UTF-8"); int temp = 0; cin >> temp; if (false); { cout << "mata in temperatur: \n"; cin >> temp; cout << "stop :P\n"; } else if(true); { cin >> temp; cout << temp < 17"\n"; } else { cout << temp > 25"\n"; return int; } }

Error listan:

C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp In function 'int main()': 22 2 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] 'else' without a previous 'if' 25 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator<' (operand types are 'std::basic_ostream<char>' and 'int') 29 2 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] 'else' without a previous 'if' 31 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator>' (operand types are 'std::basic_ostream<char>' and 'int') 32 10 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] expected primary-expression before 'int' 32 10 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] expected ';' before 'int' 32 10 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] declaration does not declare anything [-fpermissive]

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2005

Du har ett semikolon ; efter parantesen för if-satsen. Ta bort det.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2010

Gissar på att du bör ta bort semikolon här, t.ex. :
if (false);
else if(true);

Dator: MB: ASUS H87M-E mATX | CPU: Intel Core i5 4670 3.4 GHz (Haswell) | RAM: Corsair 8GB 1600Mhz | GPU: - | Chassi: Fractal Design Mini | PSU: be quiet! Pure Power L8 530W 80+ Bronze Modulär | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U9B SE2 | Operativ: Windows 10
Övrigt: Nintendo Switch, Nintendo WiiU, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, AppleTV4, Synology NAS DS415+, iPhoneSE 64GB, LG 55UH664V

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

ok tack de hade man typ "missat"

men nu kom nästa error.

else if (true) { cin >> temp; --> cout << temp < 17"\n"; }

25 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator<' (operand types are 'std::basic_ostream<char>' and 'int')

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av TheLion676:

ok tack de hade man typ "missat"

men nu kom nästa error.

else if (true) { cin >> temp; --> cout << temp < 17"\n"; }

25 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator<' (operand types are 'std::basic_ostream<char>' and 'int')

Du har missat en "<" och sen kan du inte ha 17"\n". DU får antingen ha "17\n" eller 17 << "\n"

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

@Krullieboy: du menar "temp < 17" jag har inte glömt en '<' för att det ska vara 'temp "större än" 17'
men tack att du försöker hjälpa i alla fall

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av TheLion676:

@Krullieboy: du menar "temp < 17" jag har inte glömt en '<' för att det ska vara 'temp "större än" 17'
men tack att du försöker hjälpa i alla fall

Om du vill skriva ut att det variabeln temp innehåller är större är 17 så skriver du
cout << temp << "> 17" << endl;

temp < 17 = temp är mindre än 17
temp > 17 = temp är större än 17

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av TheLion676:

ok tack de hade man typ "missat"

men nu kom nästa error.

else if (true) { cin >> temp; --> cout << temp < 17"\n"; }

25 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator<' (operand types are 'std::basic_ostream<char>' and 'int')

Tänk på att felmeddelanden, om än obegripliga ibland, ofta är en god vän när du programmerar! Här står det ju faktiskt ganska tydligt no match for 'operator<'.

Skulle även vilja rekommendera följande kodstil istället:

if (condition) { // ... } else if (condition) { // ... } else { // ... }

5930K • Corsair DP 32 GiB • EVGA GTX 980 • 2x Swift PG278Q
Better SweClockersDisplayPort över USB-C

Köp processor för framtiden™, men inte grafikkort.

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

@Krullieboy: Ok tackar, ska se om det vill funka

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004
Skrivet av TheLion676:

ok tack de hade man typ "missat"

men nu kom nästa error.

else if (true) { cin >> temp; --> cout << temp < 17"\n"; }

25 16 C:\Users\elev\OneDrive\Documents\programmering\8_1\8_1.cpp [Error] no match for 'operator<' (operand types are 'std::basic_ostream<char>' and 'int')

Du kan inte ha en operator i cout streamen ( < ), cout vet inte vad den förväntas skriva ut då du gör en jämförelse mellan två värden i streamen.

Ett annat fel jag ser är din if/else statement i grunden.

false och true är definierade som standard och du gör ingen referens till vad som ska vara sant eller falskt, false kommer alltid att vara false därav kommer det "condition" aldrig vara sant och hela den biten av programmet kan aldrig inträffa, lika så med true fast det kommer istället alltid vara true och kommer därmed alltid att ske. Vidare är datorer binära och med true och false båda kollade kan else aldrig ske om du inte lyckas göra något som går emot fysiken som styr datorn

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]
Unigine Superposition 1080p; 17487 @ Medium; 4594 @ Extreme
"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

@Krullieboy: Japp det funkade nu har jag bara det sista här:

else { cout << temp << "> 25" << "\n"; return int; }

jag vet att man inte kan ta "return int" men jag vill att om
det blir 'else' så ska programmet börja om från början.

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

@Ferrat: får ta ändra det senare, vill att bara få bort alla errors först, sedan testar jag att ta condition ist för true & false

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av Ferrat:

Du kan inte ha en operator i cout streamen ( < ), cout vet inte vad den förväntas skriva ut då du gör en jämförelse mellan två värden i streamen.

Varför skulle man inte kunna det? Om inte x < y hade varit ett uttryck med resultat hade det varit meningslöst att använda den i if-satser.

bool z = 1 < 2; cout << "1 < 2: " << z; // referential transparency fungerar i C++ också! cout << "1 < 2: " << (1 < 2); // däremot ger detta ett kompileringsfel: cout << "1 < 2: " << 1 < 2;

Jag gissar att det är operator precedence som gör att sista raden inte vill kompilera. Detta går att gå runt med hjälp av parenteser, som på raden ovan.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av TheLion676:

@Krullieboy: Japp det funkade nu har jag bara det sista här:

else { cout << temp << "> 25" << "\n"; return int; }

jag vet att man inte kan ta "return int" men jag vill att om
det blir 'else' så ska programmet börja om från början.

Enklast är det isåfall att ha en while loop runt allt och sedan en boolean som du ändrar beroende på vilken ifsats du hamnar i. Vill du inte köra igen kan du sätta din boolean till false

sen har man return 0; i slutet av main.

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Plats
Hemma
Registrerad
Feb 2016

@Krullieboy:
@Teknocide:

Tack för er bådas ideér, det borde hjälpa mig med koden!

& sen vet jag att man har 'return 0;' i slutet av main, men när jag har
kört med det på andra koder så har ju programmet bara körts en gång.

& då tänkte jag om jag ändrar typ till 'return int; eller return main;'
så skulle det återvända till början, men det funkar antagligen inte
med 'return'. Får kolla på det senare iaf, nu ska man försöka få koden
att funka med hjälp av eran hjälp ni redan har givit mig.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av TheLion676:

& sen vet jag att man har 'return 0;' i slutet av main, men när jag har
kört med det på andra koder så har ju programmet bara körts en gång.

I C++ så returneras automatiskt 0 i slutet av main, så 'return 0' är inte strikt nödvändigt där. Att returnera 0 betyder att programmet talar om för omgivningen att allt gick ok. Om något fel händer så kan man välja att returnera något annat värde som felkod, men det är inget krav.

Skrivet av TheLion676:

& då tänkte jag om jag ändrar typ till 'return int; eller return main;'
så skulle det återvända till början, men det funkar antagligen inte
med 'return'. Får kolla på det senare iaf, nu ska man försöka få koden
att funka med hjälp av eran hjälp ni redan har givit mig.

'return int' eller 'return main' är tyvärr helt fel. main deklareras alltid som 'int main' i C++, vilket betyder att du måste returnera ett heltal. Och return betyder just att du returnerar ett värde från funktionen, d.v.s. funktionen avslutas och den som anropade funktionen får tillbaka värdet som returnerades. Om du vill köra om kod flera gånger så är det istället en loop du ska kolla på, while, do-while eller for.

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004
Skrivet av Teknocide:

Varför skulle man inte kunna det? Om inte x < y hade varit ett uttryck med resultat hade det varit meningslöst att använda den i if-satser.

bool z = 1 < 2; cout << "1 < 2: " << z; // referential transparency fungerar i C++ också! cout << "1 < 2: " << (1 < 2); // däremot ger detta ett kompileringsfel: cout << "1 < 2: " << 1 < 2;

Jag gissar att det är operator precedence som gör att sista raden inte vill kompilera. Detta går att gå runt med hjälp av parenteser, som på raden ovan.

Du verkar ha missförstått vad jag skrivit, cout förstår inte < operatören därav måste den behandlas på annat håll (precis som du beskrivit) oavsett om du gör det innan via "bool z = 1 < 2;" eller genom att sätta den inom parentes så att den behandlas innan den går till cout.

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]
Unigine Superposition 1080p; 17487 @ Medium; 4594 @ Extreme
"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av Ferrat:

Du verkar ha missförstått vad jag skrivit, cout förstår inte < operatören därav måste den behandlas på annat håll (precis som du beskrivit) oavsett om du gör det innan via "bool z = 1 < 2;" eller genom att sätta den inom parentes så att den behandlas innan den går till cout.

Du skrev att cout inte förstod vad den skulle skriva ut när man gjorde en jämförelse vilket jag uppfattade som missvisande: den kan ju faktiskt skriva ut resultatet av en binäroperation. Däremot gör operator precedence att den letar efter en operator '<' på cout, vilket mycket riktigt inte finns. Av samma anledning fungerar

cout << "1 + 2 = " << 1 + 2;

utan parenteser

Bilanaloger är som Volvo — varenda svenne kör med dem