Merge pull request #421 from levibostian/c-basic-additions

Add while loop to bash. Add lots to C.
This commit is contained in:
Nami-Doc 2013-11-25 08:09:34 -08:00
commit 7c1c5e12c5
2 changed files with 136 additions and 11 deletions

View File

@ -115,6 +115,13 @@ do
echo "$VARIABLE" echo "$VARIABLE"
done done
# while loop:
while [true]
do
echo "loop body here..."
break
done
# You can also define functions # You can also define functions
# Definition: # Definition:
function foo () function foo ()

View File

@ -20,6 +20,13 @@ memory management and C will take you as far as you need to go.
Multi-line comments look like this. They work in C89 as well. Multi-line comments look like this. They work in C89 as well.
*/ */
// Constants: #define <keyword>
#define DAYS_IN_YEAR 365
//enumeration constants are also ways to declare constants.
enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT};
// MON gets 2 automatically, TUE gets 3, etc.
// Import headers with #include // Import headers with #include
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -31,8 +38,12 @@ Multi-line comments look like this. They work in C89 as well.
// Declare function signatures in advance in a .h file, or at the top of // Declare function signatures in advance in a .h file, or at the top of
// your .c file. // your .c file.
void function_1(); void function_1(char c);
void function_2(); int function_2(void);
// Must declare a 'function prototype' before main() when functions occur after
// your main() function.
int add_two_ints(int x1, int x2); // function prototype
// Your program's entry point is a function called // Your program's entry point is a function called
// main with an integer return type. // main with an integer return type.
@ -72,6 +83,10 @@ int main() {
unsigned int ux_int; unsigned int ux_int;
unsigned long long ux_long_long; unsigned long long ux_long_long;
// chars inside single quotes are integers in machine's character set.
'0' // => 48 in the ASCII character set.
'A' // => 65 in the ASCII character set.
// sizeof(T) gives you the size of a variable with type T in bytes // sizeof(T) gives you the size of a variable with type T in bytes
// sizeof(obj) yields the size of the expression (variable, literal, etc.). // sizeof(obj) yields the size of the expression (variable, literal, etc.).
printf("%zu\n", sizeof(int)); // => 4 (on most machines with 4-byte words) printf("%zu\n", sizeof(int)); // => 4 (on most machines with 4-byte words)
@ -135,13 +150,25 @@ int main() {
int cha = 'a'; // fine int cha = 'a'; // fine
char chb = 'a'; // fine too (implicit conversion from int to char) char chb = 'a'; // fine too (implicit conversion from int to char)
//Multi-dimensional arrays:
int multi_array[2][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 0}
}
//access elements:
int array_int = multi_array[0][2]; // => 3
/////////////////////////////////////// ///////////////////////////////////////
// Operators // Operators
/////////////////////////////////////// ///////////////////////////////////////
int i1 = 1, i2 = 2; // Shorthand for multiple declaration // Shorthands for multiple declarations:
int i1 = 1, i2 = 2;
float f1 = 1.0, f2 = 2.0; float f1 = 1.0, f2 = 2.0;
int a, b, c;
a = b = c = 0;
// Arithmetic is straightforward // Arithmetic is straightforward
i1 + i2; // => 3 i1 + i2; // => 3
i2 - i1; // => 1 i2 - i1; // => 1
@ -181,6 +208,20 @@ int main() {
0 || 1; // => 1 (Logical or) 0 || 1; // => 1 (Logical or)
0 || 0; // => 0 0 || 0; // => 0
//Conditional expression ( ? : )
int a = 5;
int b = 10;
int z;
z = (a > b) ? a : b; // => 10 "if a > b return a, else return b."
//Increment and decrement operators:
char *s = "iLoveC"
int j = 0;
s[j++]; // => "i". Returns the j-th item of s THEN increments value of j.
j = 0;
s[++j]; // => "L". Increments value of j THEN returns j-th value of s.
// same with j-- and --j
// Bitwise operators! // Bitwise operators!
~0x0F; // => 0xF0 (bitwise negation, "1's complement") ~0x0F; // => 0xF0 (bitwise negation, "1's complement")
0x0F & 0xF0; // => 0x00 (bitwise AND) 0x0F & 0xF0; // => 0x00 (bitwise AND)
@ -209,9 +250,8 @@ int main() {
// While loops exist // While loops exist
int ii = 0; int ii = 0;
while (ii < 10) { while (ii < 10) { //ANY value not zero is true.
printf("%d, ", ii++); // ii++ increments ii in-place printf("%d, ", ii++); // ii++ increments ii AFTER using it's current value.
// after yielding its value ("postincrement").
} // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " } // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n"); printf("\n");
@ -219,8 +259,7 @@ int main() {
int kk = 0; int kk = 0;
do { do {
printf("%d, ", kk); printf("%d, ", kk);
} while (++kk < 10); // ++kk increments kk in-place, and yields } while (++kk < 10); // ++kk increments kk BEFORE using it's current value.
// the already incremented value ("preincrement")
// => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n"); printf("\n");
@ -233,6 +272,13 @@ int main() {
printf("\n"); printf("\n");
// *****NOTES*****:
// Loops and Functions MUST have a body. If no body is needed:
int i;
for (i = 0; i <= 5; i++) {
; // use semicolon to act as the body (null statement)
}
// branching with multiple choices: switch() // branching with multiple choices: switch()
switch (some_integral_expression) { switch (some_integral_expression) {
case 0: // labels need to be integral *constant* epxressions case 0: // labels need to be integral *constant* epxressions
@ -309,7 +355,7 @@ int main() {
printf("%d\n", x); // => Prints 1 printf("%d\n", x); // => Prints 1
// Arrays are a good way to allocate a contiguous block of memory // Arrays are a good way to allocate a contiguous block of memory
int x_array[20]; int x_array[20]; //declares array of size 20 (cannot change size)
int xx; int xx;
for (xx = 0; xx < 20; xx++) { for (xx = 0; xx < 20; xx++) {
x_array[xx] = 20 - xx; x_array[xx] = 20 - xx;
@ -385,8 +431,12 @@ int add_two_ints(int x1, int x2)
} }
/* /*
Functions are pass-by-value, but you can make your own references Functions are call by value. When a function is called, the arguments passed to
with pointers so functions can mutate their values. the function are copies of the original arguments (except arrays). Anything you
do to the arguments in the function do not change the value of the original
argument where the function was called.
Use pointers if you need to edit the original argument values.
Example: in-place string reversal Example: in-place string reversal
*/ */
@ -404,6 +454,19 @@ void str_reverse(char *str_in)
} }
} }
//if referring to external variables outside function, must use extern keyword.
int i = 0;
void testFunc() {
extern int i; //i here is now using external variable i
}
//make external variables private to source file with static:
static int i = 0; //other files using testFunc() cannot access variable i
void testFunc() {
extern int i;
}
//**You may also declare functions as static to make them private**
/* /*
char c[] = "This is a test."; char c[] = "This is a test.";
str_reverse(c); str_reverse(c);
@ -494,6 +557,61 @@ typedef void (*my_fnp_type)(char *);
// ... // ...
// my_fnp_type f; // my_fnp_type f;
//Special characters:
'\a' // alert (bell) character
'\n' // newline character
'\t' // tab character (left justifies text)
'\v' // vertical tab
'\f' // new page (formfeed)
'\r' // carriage return
'\b' // backspace character
'\0' // null character. Usually put at end of strings in C lang.
// hello\n\0. \0 used by convention to mark end of string.
'\\' // backspace
'\?' // question mark
'\'' // single quote
'\"' // double quote
'\xhh' // hexadecimal number. Example: '\xb' = vertical tab character
'\ooo' // octal number. Example: '\013' = vertical tab character
//print formatting:
"%d" // integer
"%3d" // integer with minimum of length 3 digits (right justifies text)
"%s" // string
"%f" // float
"%ld" // long
"%3.2f" // minimum 3 digits left and 2 digits right decimal float
"%7.4s" // (can do with strings too)
"%c" // char
"%p" // pointer
"%x" // hexidecimal
"%o" // octal
"%%" // prints %
///////////////////////////////////////
// Order of Evaluation
///////////////////////////////////////
//---------------------------------------------------//
// Operators | Associativity //
//---------------------------------------------------//
// () [] -> . | left to right //
// ! ~ ++ -- + = *(type)sizeof | right to left //
// * / % | left to right //
// + - | left to right //
// << >> | left to right //
// < <= > >= | left to right //
// == != | left to right //
// & | left to right //
// ^ | left to right //
// | | left to right //
// && | left to right //
// || | left to right //
// ?: | right to left //
// = += -= *= /= %= &= ^= |= <<= >>= | right to left //
// , | left to right //
//---------------------------------------------------//
``` ```
## Further Reading ## Further Reading