Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn
Logiska operatorer det finns tre logiska operatorer i C && OCH ||ELLER !ICKE
Selektion nästlade if - satser printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital :... else if ( < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital :... else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital :.... } return 0; } ”gör antingen A eller B eller C.....”, endast ett alternativ utförs! minns ni det här exemplet? Provkör!
Selektion nästlade if - satser resultat av en programkörning, exekveringsresultat!
Logiska operatorer /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital : -kapital)/10); else if ( < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital : -kapital)/100); else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital : -kapital)/1000); om villkoret -10<kapital OCH villkoret kapital<10 bägge är sanna så blir hela villkoret sant och printf() utförs.
Logiska operatorer (villkor_1 && villkor_2 && villkor_3 &&...) –alla villlkoren skall vara sanna för att hela uttrycket skall bli sant –villkor_1 OCH villkor_2 OCH villkor_3 OCH.... (villkor_1 || villkor_2 || villkor_3 ||...) –något, eller flera, av villkoren skall vara sant för att hela uttrycket skall bli sant –villkor_1 ELLER villkor_2 ELLER villkor_3 ELLER.. (!villkor) –hela uttrycket sant om villkor är falskt eller falskt om villkor är sant –ICKE villkor
Bit-operatorer påverkar enskilda bitar i minnet ~ negation, bit för bit << vänsterskift >> högerskift & OCH, bit för bit ^ exklusiv ELLER, bit för bit | ELLER, bit för bit 2 bytes16 bits bit short int
Bit-operatorer ~ negation, bit för bit ~67 = ~= == ?? Vad tror du det blir?
Bit-operatorer ~ negation, bit för bit ~67 = ~= == -68 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" ~67 = ~("); bin_prnt_short( 67 ); printf(") = ("); bin_prnt_short( ~67 ); printf(") = %d", ~67 ); system( " PAUSE " ); return 0; } Se kurswebben för: bin_prnt_short()
Windows kalkylator = - 68
Bit-operatorer << vänsterskift 67<<2 = <<2 = == ?? Vad tror du det blir?
Bit-operatorer << vänsterskift ( logisk skift vänster = 0:r in ) 67<<2 = <<2 = == 268 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67<<2 = ("); bin_prnt_short( 67 ); printf(")<<2 = ("); bin_prnt_short( 67<<2 ); printf(") = %d", 67<<2 ); system( " PAUSE " ); return 0; }
Bit-operatorer >> högerskift 67u>>2 = >>2 = == ?? Vad tror du det blir?
Bit-operatorer >> högerskift ( logisk skift höger = 0:r in ) 67u>>2 = >>2 = == 16 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67u>>2 = ("); bin_prnt_short( 67u ); printf(")<<2 = ("); bin_prnt_short( 67u<<2 ); printf(") = %d", 67u<<2 ); system( " PAUSE " ); return 0; }
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67>>2 = >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67>>2 = >>2 = == ? #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67>>2 = ("); bin_prnt_short( 67 ); printf(")<<2 = ("); bin_prnt_short( 67<<2 ); printf(") = %d", 67<<2 ); system( " PAUSE " ); return 0; } Tydligen skiftades 0:or in, men detta är inget som ANSI-C lovar!
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67>>2= >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67>>2= >>2 = == ? #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67>>2 = ("); bin_prnt_short( -67 ); printf(")<<2 = ("); bin_prnt_short( -67<<2 ); printf(") = %d", -67<<2 ); system( " PAUSE " ); return 0; } Det blev aritmetiskt skift med den här kompilatorn (inget som ANSI-C lovar)…
Bit-operatorer & OCH-operatorn, bit för bit -67&0xff= & = = = ? Vad tror du det blir?
Bit-operatorer & OCH-operatorn, bit för bit -67&0xff= & = = = 189 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67&0xff = ("); bin_prnt_short( -67 ); printf(") &0xff = ("); bin_prnt_short( -67&0xff ); printf(") = %d", -67&0xff ); system( " PAUSE " ); return 0; }
Windows kalkylator
And-mask -67 & 0xff tal mask OCH, AND: De bitpositioner som är 0 i masken nollställer motsvarande bitpositioner i talet. På det sättet kan man påverka enskilda bitar i en variabel.
Bit-operatorer ^ exklusiv ELLER-operatorn, bit för bit -67^0x0f= ^ = = = ? Vad tror du det blir?
Bit-operatorer ^ exklusiv ELLER-operatorn, bit för bit - 67^0x0f= ^ = = = -78 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67^0x0f = ("); bin_prnt_short( -67 ); printf(") ^0x0f = ("); bin_prnt_short( -67^0x0f ); printf(") = %d", -67^0x0f ); system( " PAUSE " ); return 0; }
Exor-mask -67 ^ 0x0f tal mask Exor: De bitpositioner som är 1 i masken togglar (=byter värde på) motsvarande bitpositioner i talet. De bitpositioner som är 0 i masken lämnas oförändrade. På det sättet kan man byta värde på enskilda bitar i en variabel.
Bit-operatorer | ELLER-operatorn, bit för bit -67|0x0f= | = = = ? Vad tror du det blir?
Bit-operatorer | ELLER-operatorn, bit för bit -67|0x0f= | = = = -65 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67|0x0f = ("); bin_prnt_short( -67 ); printf(") |0x0f = ("); bin_prnt_short( -67|0x0f ); printf(") = %d", -67|0x0f ); system( " PAUSE " ); return 0; }
Eller, OR - mask -67 | 0x0f tal mask Or: De bitpositioner som är 1 i masken ettställer motsvarande bitpositioner i talet. På det sättet kan man ettställa enskilda bitar i en variabel.
Bit-operatorer exempel
databitar byglat, not busy, not out of paper parallellporten printerport Parallellportar försvinner mer och mer från datorerna, vi byter från PC till en inbyggnadsprocessor PIC
Adventljus med PIC16F690
PIC-processorn? Ej enligt ANSI-standarden, men lämpliga storlekar för en pytteliten 8-bitsprocessor som har bitinstruktioner är: bit 1/8 Byte, char 1 Byte (unsigned), int 1Byte (signed) long 2 Bytes (signed)
C-kod (ej ANSI) för PIC-processorn printf("Advent: 1, 2, 3, 4 Light flicker: +,-\r\n",0); while(1) { if( receiver_flag ) /* Character received? */ { choice = getchar(); switch (choice) { case '1': mask = 0x01; /* */ printf("%c First\r\n", choice); break; case '2': mask = 0x03; /* */ printf("%c Second\r\n", choice); break; case '3': mask = 0x07; /* */ printf("%c Third\r\n", choice); break; case '4': mask = 0x0F; /* */ printf("%c Fourth\r\n", choice); break;
fortsättning … case '+': if(speed > 0) speed --; else speed = 0; printf("%c Increasing flicker, ", choice); printf("delay %u\r\n", speed); break; case '-': if(speed < 254) speed ++; else speed = 255; printf("%c Decreasing flicker, ", choice); printf("delay %u\r\n", speed); break; default : mask = 0x00; /* */ printf("%c Choose advent: 1, 2, 3, 4 Light flicker: +,-r\n",choice); } } flicker = rand(); flicker &= mask; PORTC = flicker; delay(5); /* minimum delay */ delay(speed); } }
Adventstider … flicker = rand(); flicker &= mask; PORTC = flicker; mask & Slumptal rand() Fladdrande ljuslågor …
”Annons” för IL131V Digitalteknik med PIC Digitalteknik med PIC-processor 7.5 hp IL131V. 12 veckor ht/vt 1 kväll i veckan. Sök kursen på studera.nu !
Adress - operatorn &
/* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } Adress - operatorn Maskinkod programmet Heap Stack Bytes antalAr=1 kapital =100 funktionen scanf() är en funktion som vill ha reda på var i primärminnet ( adressen ) det inlästa skall lagras. Detta erhålls m h a adressoperatorn & xxxxxxxx
Komma - operatorn,
Komma - operatorn exempel /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); void Kalkylator( void ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); Kalkylator(); return 0; } minns ni exemplet med kalkylatorn i? forts
void Kalkylator( void ) /* Enkel kalkylator */ { float x, y; char c; printf( "\nKalkylator som klarar de fyra räknesätten t ex 3+2\n"); printf( "A, avslutar\n"); while (printf("-->"), scanf("%f%c%f", &x, &c, &y ) == 3) { switch(c) { case '+': printf("%f\n", x + y); break; case '-': printf("%f\n", x - y); break; case '*': printf("%f\n", x * y); break; case '/': if (y != 0) printf("%f\n", x / y); else printf("Division med noll\n"); break; default: printf("Felaktig operator\n"); break; } return; } Komma - operatorn exempel Se ”kommat” i while-satsen. Den gör att man kan exekvera flera uttryck i parentesen, från vänster till höger. Resultatet av det sista uttrycket är upprepningsvillkoret
Punkt - operatorn. Denna operator har vi ännu inte stött på, den kommer senare. Den används för att nå ett delminne i ett större minne. Inte undra på att programmen vi skriver på övningar och laborationer kraschar när varenda skiljetecken vi skriver eller glömmer är en operator !
högst prioritet har de unära postfixoperatorerna [] (). -> sedan kommer de unära prefixoperatorerna & * + - ~ ! (typnamn) därefter de aritmetiska ( rikning V till H ) * / % + - skiftoperatorer ( rikning V till H ) > jämförelseoperatorerna ( rikning V till H ) = == != bit-operatorerna ( rikning V till H ) & ^ | logiska operatorer ( rikning V till H ) && || villkorsoperatorn ( rikning H till V ) ? uttryck : tilldelningsoperatorer ( rikning H till V ) = *= /= %= += -= >= &= ~= |= kommaoperatorn ( riktning V till höger ), Operatorprioritet
Slut