Använda två IF i en rad?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Använda två IF i en rad?

Inlägg av fosfor »

Hej!

Om jag vill att två IF's ska vara sanna för att gå vidare.
Hur ser en sådan rad ut?
Räcker det med ett + tecken

Typ

Kod: Markera allt

  {
  if ( blabla1 + bleble2 )
    {
Jag vill att en integer ska vara true och att en positionering ska vara inom ett visst värde, för att den sen ska gå vidare till handling.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Använda två IF i en rad?

Inlägg av Icecap »

if(Villkor1 && Villkor2)

&& betyder "logisk AND" medan & betyder "bitmässigt AND".

I ovanstående betyder det att om BÅDA Villkor1 OCH Villkor2 är sanna utförs det som står efter in-satsen.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Använda två IF i en rad?

Inlägg av fosfor »

Ah ok perfekt, tack
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Använda två IF i en rad?

Inlägg av fosfor »

Icecap:
Vad skulle du säga är mest praktiska sättet att göra en "virtuell switch på"?

Jag vill bara ha något som antingen är "true" eller "false" (men som kan byta emellan true eller false, så den ska inte vara fast).
Det är inte integer va?

Den ska ändras beroende på vad jag gjort och tryckt på för knappar. Så att den kan veta vad att göra och inte göra.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Använda två IF i en rad?

Inlägg av adent »

+ är fel tecken. En if-sats tolkar allt som är skiljt från 0 som sant.

if(0) -> falskt
if(1) -> sant
if(2) -> sant
if(45 +33) -> sant
if(45 - 45) -> falskt.

Men strunt i det ovan. Så här gör man:

Kod: Markera allt

if(a > 3 && b < 4)
-> sant om a är större än 3 OCH b är mindre än 4.

Jag föredrar att skriva raden ovan såhär för att undvika missar p.g.a. operatorprioritet:

Kod: Markera allt

if((a > 3) && (b < 4))
-> sant om a är större än 3 OCH b är mindre än 4.

Du kan också skriva såhär:

Kod: Markera allt

if(a > 3)
{ 
  if(b <4)
  {
     // Här hamnar vi bara om a är större än 3 OCH b är mindre än 4.
  }
}
Om det räcker att ett av villkoren är sant så kör med || istället för &&.

|| ska i detta fall utläsas som "eller" och && som "och".

Det jag sa om att 0 är falskt och 1 är sant i en ifsats kan man faktiskt se enkelt med t.ex. följande kod:

Kod: Markera allt

int a = 3;

printf("a större än 3: %d\n", (a>3) );
printf("a mindre än 3: %d\n", (a<3) );
Koden ovan kommer skriva ut 0 och 0 på varsin rad för att uttrycket (a>3) returnerar 0 -> falskt.
uttrycket (a<3) kommer också returnera 0 -> falskt. Prova att ändra den första tre:an och se det bli 1 ibland :)

Sedan kan du testa nedanstående kod också :)

Kod: Markera allt

printf("0 && 0: %d\n", (0 && 0) );
printf("0 && 1: %d\n", (0 && 1) );
printf("1 && 0: %d\n", (1 && 0) );
printf("1 && 1: %d\n", (1 && 1) );

Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Använda två IF i en rad?

Inlägg av fosfor »

adent:
Ok strålande, det klargjorde ett och annat!

Men om jag vill ha en "virtuell" knapp/switch också till detta?
Jag kan ju skriva t.ex. int intest1Pin = 4;
och den läser då av knappen jag har inkopplad dit som antingen true eller false.

MEN om jag bara vill ha en liten "del" i koden som antingen är true eller false, som kan ändras av koden i loopen,
hur gör jag det smidigast? Typ att om jag gör vissa saker så ställts den om till true, och om jag göra lite andra saker så ställs den om till false.
Och att den håller kvar vid vad den är tills att något ändrar på den. Hur gör jag det smidigast?

Detta är till för att hindra vissa delar av koden göra vissa saker beroende på vad jag gjort innan.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Använda två IF i en rad?

Inlägg av sodjan »

C har inga "bool" variabler (alltså variabler som enbart har två
giltiga värden "true" och "false"). Många andra språk har det.
Man använder helt enkelt den minsta tillgängliga integern, normalt
en 8-bitars byte genom en "char" och sedan låter man den få värdet
0 eller 1. Normalt finns det fördefinierade symboler med namn som
True, TRUE, False, FALSE eller liknande som har rätt värde. Alltså
istället för att hårdkoda 1 eller 0 i koden...
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Använda två IF i en rad?

Inlägg av mankan »

I C99 finns bool.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Använda två IF i en rad?

Inlägg av sodjan »

Ah, där ser man... För modernt för mig... :-)
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Använda två IF i en rad?

Inlägg av hawkan »

Men fosfor, många av dina frågor har inte med mikroprocessorer att göra speciellt. Utan helt enkelt med språket C att göra.
Det är inte så att du tror du skulle vinna på att ta dej igenom några kapitel i nån kurs om det är på youtube, bok, eller vad som helst?

Misstolka inte för vi tycker det är jättekul att hjälpa dej. Men med lite mer kunskap i C kan det gå fortare fram för dej.
Vi ser ju att du har ett intresse och har intressanta problem.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Använda två IF i en rad?

Inlägg av TomasL »

Hmm, jag skulle nog gjort en enum för tangentkombinationerna, och sedan använt en switch-sats.
Blir faktiskt väldigt mycket tydligare än en härrans massa if-satser
Om man i enumen tilldelar värden, så kan man ändra standard-värdena
till exempel typedef enum { none = 0xFF, upp = 0x01, ned 0x02, left = 0x10, right = 0x20} keyb_enum;

Kod: Markera allt

typedef enum { none, upp, ned, left, right} keyb_enum;
/* 
none = 0
upp = 1
ned = 2
left = 3
right = 4
*/

keyb_enum keyboard_e = none;


switch (keyboard_e)
{
    case none
          break;

    case upp:
          …………;
         ………….;
          break;

   case ned:
          …………;
         ………….;
          break;

   case right:
          …………;
         ………….;
          break;

   case left:
          …………;
         ………….;
          break;

    default:
          // vi har ett jättefel
}
 
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Använda två IF i en rad?

Inlägg av lillahuset »

Ett tips är att skriva program helt på engelska, man vet aldrig om det kommer att underhällas av en skandinav i framtiden.
Jag har underhållit program på blandad tyska och engelska, tröttsamt men någorlunda OK.
Jag har underhållit program på blandad rumänska och engelska, tack Manni DeGeer för att du lärde mig tillräckligt med franska för att hjälpligt kunna tolka rumänskan. Annars hade jag gett upp.
Jag har underhållit program på blandad ungerska och engelska, jävligt jobbigt. Någonstans ligger det ett ungerskt-engelskt-ungerst lexikon. Fy f-n för programmerare som absolut ska använda sitt modersmål i program.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Använda två IF i en rad?

Inlägg av TomasL »

Jag vet, tyvärr blir det svengelska ibland.
Å andra sidan, så eftersom vi är svenskar och bor i Sverige så tycker jag att det svenska språket skall användas.
Vi får väl se till att enbart anställa svensktalande utvecklare i framtiden, dock åäö är lite svåra i ren kod, konstigheter kan hända.
Vi får ta fram en svensk version av GCC
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Använda två IF i en rad?

Inlägg av lillahuset »

Kod har en tendens att migrera. Och drabba oskyldiga utvecklare. :(
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Använda två IF i en rad?

Inlägg av TomasL »

Jo jag vet, ytterligare en anledning att lära sig nya språk.
Skriv svar