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

Permalänk

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]

Permalänk
Mattecoach

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

Permalänk

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

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk

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')

Permalänk
Medlem
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"

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk

@Nollan: 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

Permalänk
Medlem
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

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
99:e percentilen
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 { // ... }

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

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

Permalänk
Medlem
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

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk

@Nollan: 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.

Permalänk

@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

Permalänk
Medlem
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.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
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.

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk

@Nollan:
@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.

Permalänk
Medlem
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.

Permalänk
Medlem
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.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem
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

Visa signatur

Kom-pa-TI-bilitet