mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2025-05-06 14:58:31 +00:00
Merge pull request #421 from levibostian/c-basic-additions
Add while loop to bash. Add lots to C.
This commit is contained in:
commit
7c1c5e12c5
@ -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 ()
|
||||||
|
140
c.html.markdown
140
c.html.markdown
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user