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!
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
Bit-operatorer ~ negation, bit för bit ~67 = ~= == ?? Vad tror du det blir?
Bit-operatorer ~ negation, bit för bit ~67 = ~= == -68 bitop_1.exe #include void BinPrint( unsigned tal ); int main( void ) { printf(" ~67 = ~(");BinPrint( 67 ); printf(") = ("); BinPrint( ~67 ); printf(") = %d", ~67 ); return 0; }
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 bitop_2.exe #include void BinPrint( unsigned tal ); int main( void ) { printf("67<<2 = (");BinPrint( 67 ); printf(")<<2 = ("); BinPrint( 67<<2 ); printf(") = %d", 67<<2 ); 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 bitop_3.exe #include void BinPrint( unsigned tal ); int main( void ) { printf("67u>>2 = (");BinPrint( 67u ); printf(")>>2 = ("); BinPrint( 67u>>2 ); printf(") = %d", 67u>>2 ); return 0; }
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67u>>2 = >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67u>>2 = >>2 = == ? bitop_5.exe #include void BinPrint( unsigned tal ); int main( void ) { printf("67>>2 = (");BinPrint( 67 ); printf(")>>2 = ("); BinPrint( 67>>2 ); printf(") = %d", 67>>2 ); return 0; }
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67u>>2= >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67u>>2= >>2 = == ? bitop_4.exe #include void BinPrint( unsigned tal ); int main( void ) { printf("-67>>2 = (");BinPrint( -67 ); printf(")>>2 = ("); BinPrint( -67>>2 ); printf(") = %d", -67>>2 ); return 0; }
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 BinPrint( unsigned tal ); int main( void ) { printf("-67&0xff =(");BinPrint(-67); printf(")&\n"); printf("\t (");BinPrint( 0xff );printf(") =\n"); printf("\t (");BinPrint( -67&0xff );printf(") ="); printf("%d", -67&0xff ); return 0; } and.exe
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 BinPrint( unsigned tal ); int main( void ) { printf("-67^0x0f =(");BinPrint(-67); printf(")^\n"); printf("\t (");BinPrint( 0x0f );printf(") =\n"); printf("\t (");BinPrint( -67^0x0f );printf(") ="); printf("%d", -67^0x0f ); return 0; } xor.exe
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 BinPrint( unsigned tal ); int main( void ) { printf("-67|0x0f =(");BinPrint(-67); printf(")|\n"); printf("\t (");BinPrint( 0x0f );printf(") =\n"); printf("\t (");BinPrint( -67|0x0f );printf(") ="); printf("%d", -67|0x0f ); return 0; } or.exe
Bit-operatorer exempel advent.exe
Bit-operatorer exempel /* ej ANSII-program, fungerar som dos-program, byglad LPT */ #include int main( void ){ unsigned PortNum = 0x0; /* LPT1 -> 0, LPT2 -> 1 */ unsigned mask = 0x01, delayTime = 100, forts = 1 /* sant */; forts
printf(" \ntangent 5 avslutar !"); while ( forts ){ if ( kbhit() ){ switch ( getch() ){ case ( '1' ) : mask = 0x01; break; /* */ case ( '2' ) : mask = 0x03; break; /* */ case ( '3' ) : mask = 0x07; break; /* */ case ( '4' ) : mask = 0x0f; break; /* */ case ( '+' ) :delayTime /= 2 ; if (delayTime < 1 ) delayTime = 1 ; break; case ( '-' ) : delayTime *= 2 ; if (delayTime > 1000 ) delayTime = 1000 ; break; case ( '5' ) : forts = 0 ; /* falskt, terminerar */ } _bios_printer(_PRINTER_WRITE, PortNum, rand() & mask ); delay(delayTime); _bios_printer(_PRINTER_WRITE, PortNum, rand() & mask ); delay(delayTime); } return 0; } Bit-operatorer exempel
databitar byglat, not busy, not out of paper parallellporten printerport
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 räntafkn.exe
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 kalkylat.exe
Komma - operatorn exempel void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } forts kalkylat.exe det är nästa bild som är intressant
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 kalkylat.exe 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.
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