====== C ======
==== VARIABLES ====
* **char** - 1 byte - is used to store a single character (ASCII) value
char Temp; // Variable definition or declaration (letting compiler know we will need it in the future)
Temp = 25; // Variable initialisation (assigning a value)
extern int my_var // Declaration. It tells the compiler that my_var is defined outside this file
**Address of the variable**
char a1 = 'A';
&a1 // Gives you an address - memory location of the variable temp. Type is char*
printf("%p\n", &a1) // %p - is the special format specifier for pointers
**Storage Class** of the variable defines:
* Scope of the variable
* Visibility of the variable
* Life time of the variable
**static** - creates global variable but private to the specific function.
void myFunc(void)
{
static int count = 0;
count = count + 1;
printf("Function was called %d times\n", count);
}
Another use case for **static** - prevent access to the global variables from another files:
static int internal_global_var; // Won't be accessible outside this file, even with extern
**extern** - is used to access the global variable, which is defined outside the scope of a file
**ASCII**
char a1 = 'A'; // Compiler replaces 'A' with 65 and stores it in a1
char a2 = 65; // basically the same as initialising it with 'A'
printf("%c\n", a1); // prints 'A'
printf("%c\n", a2); // prints also 'A'
==== PRINTF FORMATTERS ====
* %u - unsigned
* %lf - double
* %f - float
* %le, %e - real number in the scientific representation
* %#x - hexadecimal with a leading 0x
* %s - string
==== ASCII ==
char a1 = 'A'; // Compiler will replace 'A' with 65
If an arithmetic operator has one floating-point operand and one integer operand, however, the integer will be converted to floating point before the operation is done.
==== PRECEDENCE ====
- !=
- =
==== LOGICAL OPERATORS ====
* && - AND
* || - OR
* ! - NOT
**True** is anything but 0, e.g.
uint8_t a = 4;
uint8_t b = 8;
uint8_t c = 0;
c = a && b; // c == 1
==== BITWISE OPERATORS ====
* & - bitwise AND (usually used to test or clear bits)
* | - bitwise OR (usually used to set bits)
* ~ - bitwise NOT (unary operator, usually used to clear bits)
* ^ - XOR (usually used to toggle bits)
a = ~c; // bitwise unary NOT
==== BITWISE SHIFT ===
* >> - a value will be divided by 2 for each right shift
* << - a value will be multiplied by 2 for each left shift
Example clearing the 4th bit with a bitwise shift operator and negation:
data = data &~(1<<4);
Example bit extraction for bits [14:9]. The algorithm:
- Shift the portion to the right, until it touches the LSB
- Mask the value to extract only 6 bits [5:0]
data = data >> 9;
data &=63;
==== LOOPING ====
WHILE
while(expression) // repeat execution of code inside the loop body until expression evaluates to 0
{
statemen1;
}