1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-13 18:24:39 +02:00
This commit is contained in:
Adam
2013-08-16 09:44:22 -07:00
parent 5be20756e0
commit 8aa0ab6068
7 changed files with 239 additions and 238 deletions

View File

@@ -1,11 +1,9 @@
---
- name: c
- category: language
- language: c
- filename: learnc.c
- contributors:
- [Adam Bard](http://adambard.com/)
- [Árpád Goretity](http://twitter.com/H2CO3_iOS)
language: c
filename: learnc.c
contributors:
- ["Adam Bard", "http://adambard.com/"]
- ["Árpád Goretity", "http://twitter.com/H2CO3_iOS"]
---
@@ -27,17 +25,10 @@ Multi-line comments look like this. They work in C89 as well.
#include <stdio.h>
#include <string.h>
// file names between <angle brackets> are headers from the C standard library.
// They are searched for by the preprocessor in the system include paths
// (usually /usr/lib on Unices, can be controlled with the -I<dir> option if you are using GCC or clang.)
// (File names between <angle brackets> are headers from the C standard library.)
// For your own headers, use double quotes instead of angle brackets:
#include "my_header.h"
// The C preprocessor introduces an almost fully-featured macro language. It's useful, but
// it can be confusing (and what's even worse, it can be misused). Read the
// Wikipedia article on the C preprocessor for further information:
// http://en.wikipedia.org/wiki/C_preprocessor
// Declare function signatures in advance in a .h file, or at the top of
// your .c file.
void function_1();
@@ -55,10 +46,6 @@ int main() {
// Types
///////////////////////////////////////
// You have to declare variables before using them. A variable declaration
// requires you to specify its type; a variable's type determines its size
// in bytes.
// ints are usually 4 bytes
int x_int = 0;
@@ -80,30 +67,23 @@ int main() {
// doubles are usually 64-bit floating-point numbers
double x_double = 0.0;
// Integral types may be unsigned. This means they can't be negative, but
// the maximum value of an unsigned variable is greater than the maximum
// signed value of the same size.
unsigned char ux_char;
// Integral types may be unsigned.
unsigned short ux_short;
unsigned int ux_int;
unsigned long long ux_long_long;
// Other than char, which is always 1 byte (but not necessarily 8 bits!),
// these types vary in size depending on your machine and compiler.
// sizeof(T) gives you the size of a variable with type T in
// bytes so you can express the size of these types in a portable way.
// sizeof(obj) yields the size of an actual expression (variable, literal, etc.).
// For example,
// 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.).
printf("%zu\n", sizeof(int)); // => 4 (on most machines with 4-byte words)
// It's worth noting that if the argument of the `sizeof` operator is not a type but an expression,
// then its argument is not evaluated except VLAs (see below). Also, `sizeof()` is an operator, not a function,
// furthermore, the value it yields is a compile-time constant (except when used on VLAs, again.)
// If the argument of the `sizeof` operator an expression, then its argument
// is not evaluated (except VLAs (see below)).
// The value it yields in this case is a compile-time constant.
int a = 1;
size_t size = sizeof(a++); // a++ is not evaluated
printf("sizeof(a++) = %zu where a = %d\n", size, a);
// the above code prints "sizeof(a++) = 4 where a = 1" (on a usual 32-bit architecture)
// prints "sizeof(a++) = 4 where a = 1" (on a 32-bit architecture)
// Arrays must be initialized with a concrete size.
char my_char_array[20]; // This array occupies 1 * 20 = 20 bytes
@@ -122,18 +102,21 @@ int main() {
my_array[1] = 2;
printf("%d\n", my_array[1]); // => 2
// In C99 (and as an optional feature in C11), variable-length arrays (VLAs) can be declared as well.
// The size of such an array need not be a compile time constant:
// In C99 (and as an optional feature in C11), variable-length arrays (VLAs)
// can be declared as well. The size of such an array need not be a compile
// time constant:
printf("Enter the array size: "); // ask the user for an array size
char buf[0x100];
fgets(buf, sizeof buf, stdin);
size_t size = strtoul(buf, NULL, 10); // strtoul parses a string to an unsigned integer
// strtoul parses a string to an unsigned integer
size_t size = strtoul(buf, NULL, 10);
int var_length_array[size]; // declare the VLA
printf("sizeof array = %zu\n", sizeof var_length_array);
// A possible outcome of this program may be:
Enter the array size: 10
sizeof array = 40
// > Enter the array size: 10
// > sizeof array = 40
// Strings are just arrays of chars terminated by a NUL (0x00) byte,
// represented in strings as the special character '\0'.
@@ -142,21 +125,13 @@ int main() {
char a_string[20] = "This is a string";
printf("%s\n", a_string); // %s formats a string
/*
You may have noticed that a_string is only 16 chars long.
Char #17 is the NUL byte.
Chars #18, 19 and 20 are 0 as well - if an initializer list (in this case, the string literal)
has less elements than the array it is initializing, then excess array elements are implicitly
initialized to zero. This is why int ar[10] = { 0 } works as expected intuitively.
*/
printf("%d\n", a_string[16]); // => 0
// i.e., byte #17 is 0 (as are 18, 19, and 20)
// So string literals are strings enclosed within double quotes, but if we have characters
// between single quotes, that's a character literal.
// If we have characters between single quotes, that's a character literal.
// It's of type `int`, and *not* `char` (for historical reasons).
int cha = 'a'; // fine
char chb = 'a'; // fine too (implicit conversion from int to char - truncation)
char chb = 'a'; // fine too (implicit conversion from int to char)
///////////////////////////////////////
// Operators
@@ -171,7 +146,8 @@ int main() {
i2 * i1; // => 2
i1 / i2; // => 0 (0.5, but truncated towards 0)
f1 / f2; // => 0.5, plus or minus epsilon - floating-point numbers and calculations are not exact
f1 / f2; // => 0.5, plus or minus epsilon
// Floating-point numbers and calculations are not exact
// Modulo is there as well
11 % 3; // => 2
@@ -211,10 +187,10 @@ int main() {
0x01 << 1; // => 0x02 (bitwise left shift (by 1))
0x02 >> 1; // => 0x01 (bitwise right shift (by 1))
// Be careful when shifting signed integers - the following are all undefined behavior:
// Be careful when shifting signed integers - the following are undefined:
// - shifting into the sign bit of a signed integer (int a = 1 << 32)
// - left-shifting a negative number (int a = -1 << 2)
// - shifting by an offset which is more than or equal to the width of the type of the LHS:
// - shifting by an offset which is >= the width of the type of the LHS:
// int a = 1 << 32; // UB if int is 32 bits wide
///////////////////////////////////////
@@ -232,7 +208,8 @@ int main() {
// While loops exist
int ii = 0;
while (ii < 10) {
printf("%d, ", ii++); // ii++ increments ii in-place, after yielding its value ("postincrement").
printf("%d, ", ii++); // ii++ increments ii in-place
// after yielding its value ("postincrement").
} // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n");
@@ -240,7 +217,8 @@ int main() {
int kk = 0;
do {
printf("%d, ", kk);
} while (++kk < 10); // ++kk increments kk in-place, and yields the already incremented value ("preincrement")
} while (++kk < 10); // ++kk increments kk in-place, and yields
// the already incremented value ("preincrement")
// => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n");
@@ -257,7 +235,7 @@ int main() {
switch (some_integral_expression) {
case 0: // labels need to be integral *constant* epxressions
do_stuff();
break; // if you don't break, control flow falls over labels - you usually don't want that.
break; // if you don't break, control flow falls over labels
case 1:
do_something_else();
break;
@@ -285,9 +263,8 @@ int main() {
// Types will overflow without warning
printf("%d\n", (unsigned char) 257); // => 1 (Max char = 255 if char is 8 bits long)
// printf("%d\n", (unsigned char) 257); would be undefined behavior - `char' is usually signed
// on most modern systems, and signed integer overflow invokes UB.
// Also, for determining the maximal value of a `char`, a `signed char` and an `unisigned char`,
// For determining the max value of a `char`, a `signed char` and an `unisigned char`,
// respectively, use the CHAR_MAX, SCHAR_MAX and UCHAR_MAX macros from <limits.h>
// Integral types can be cast to floating-point types, and vice-versa.
@@ -318,8 +295,9 @@ int main() {
// To retreive the value at the address a pointer is pointing to,
// put * in front to de-reference it.
// Note: yes, it may be confusing that '*' is used for _both_ declaring a pointer and dereferencing it.
printf("%d\n", *px); // => Prints 0, the value of x, which is what px is pointing to the address of
// Note: yes, it may be confusing that '*' is used for _both_ declaring a
// pointer and dereferencing it.
printf("%d\n", *px); // => Prints 0, the value of x
// You can also change the value the pointer is pointing to.
// We'll have to wrap the de-reference in parenthesis because
@@ -328,7 +306,8 @@ int main() {
printf("%d\n", *px); // => Prints 1
printf("%d\n", x); // => Prints 1
int x_array[20]; // 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 xx;
for (xx = 0; xx < 20; xx++) {
x_array[xx] = 20 - xx;
@@ -342,7 +321,8 @@ int main() {
// it decays into (implicitly converted to) a pointer.
// Exceptions: when the array is the argument of the `&` (address-od) operator:
int arr[10];
int (*ptr_to_arr)[10] = &arr; // &arr is NOT of type `int *`! It's of type "pointer to array" (of ten `int`s).
int (*ptr_to_arr)[10] = &arr; // &arr is NOT of type `int *`!
// It's of type "pointer to array" (of ten `int`s).
// or when the array is a string literal used for initializing a char array:
char arr[] = "foobarbazquirk";
// or when it's the argument of the `sizeof` or `alignof` operator:
@@ -362,7 +342,7 @@ int main() {
// may not be true on e. g. embedded systems - the C standard says nothing about it).
int *my_ptr = malloc(sizeof(*my_ptr) * 20);
for (xx = 0; xx < 20; xx++) {
*(my_ptr + xx) = 20 - xx; // my_ptr[xx] = 20-xx would also work here, and it's also more readable
*(my_ptr + xx) = 20 - xx; // my_ptr[xx] = 20-xx
} // Initialize memory to 20, 19, 18, 17... 2, 1 (as ints)
// Dereferencing memory that you haven't allocated gives
@@ -381,7 +361,8 @@ int main() {
const char *my_str = "This is my very own string literal";
printf("%c\n", *my_str); // => 'T'
// This is not the case if the string is an array (potentially initialized with a string literal)
// This is not the case if the string is an array
// (potentially initialized with a string literal)
// that resides in writable memory, as in:
char foo[] = "foo";
foo[0] = 'a'; // this is legal, foo now contains "aoo"
@@ -435,17 +416,17 @@ printf("%s\n", c); // => ".tset a si sihT"
typedef int my_type;
my_type my_type_var = 0;
// Structs are just collections of data, the members are allocated sequentially, in the order they are written:
// Structs are just collections of data, the members are allocated sequentially,
// in the order they are written:
struct rectangle {
int width;
int height;
};
// it's generally not true that sizeof(struct rectangle) == sizeof(int) + sizeof(int) due to
// potential padding between the structure members (this is for alignment reasons. Probably won't
// happen if all members are of the same type, but watch out!
// See http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member
// for further information.
// It's not generally true that
// sizeof(struct rectangle) == sizeof(int) + sizeof(int)
// due to potential padding between the structure members (this is for alignment
// reasons). [1]
void function_1()
{
@@ -473,7 +454,8 @@ int area(rect r)
return r.width * r.height;
}
// if you have large structs, you can pass them "by pointer" to avoid copying the whole struct:
// if you have large structs, you can pass them "by pointer" to avoid copying
// the whole struct:
int area(const rect *r)
{
return r->width * r->height;
@@ -527,3 +509,5 @@ Readable code is better than clever code and fast code. For a good, sane coding
[Linux kernel coding stlye](https://www.kernel.org/doc/Documentation/CodingStyle).
Other than that, Google is your friend.
[1] http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member

View File

@@ -1,5 +1,6 @@
---
language: java
filename: java-kr.java
category: language
contributors:
- ["Jake Prather", "http://github.com/JakeHP"]
@@ -26,7 +27,8 @@ import java.util.ArrayList;
// java.security 패키지 안에 있는 모든 클래스를 임포트합니다.
import java.security.*;
// 각 .java 파일에는 공용(public) 클래스가 들어 있으며, 클래스의 이름은 파일명과 동일합니다.
// 각 .java 파일에는 공용(public) 클래스가 들어 있으며, 클래스의 이름은
// 파일명과 동일합니다.
public class LearnJava {
// 프로그램에는 반드시 진입점 역할을 하는 main 메서드가 하나 있어야 합니다.
@@ -253,8 +255,8 @@ public class LearnJava {
// String
// 형변환
// 자바 객채 또한 형변환할 수 있으며, 이와 관련해서 알아야 할 세부사항이 많을뿐더러
// 다소 중급 수준에 해당하는 개념들도 다뤄야 합니다.
// 자바 객채 또한 형변환할 수 있으며, 이와 관련해서 알아야 할 세부사항이
// 많을뿐더러 다소 중급 수준에 해당하는 개념들도 다뤄야 합니다.
// 이와 관련된 사항은 아래 링크를 참고하세요.
// http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

View File

@@ -1,5 +1,6 @@
---
language: ruby
lang: br-pt
filename: learnruby.rb
contributors:
- ["Bruno Henrique - Garu", "http://garulab.com"]
@@ -98,9 +99,10 @@ caminho_para_a_raiz_do_projeto = '/bom/nome/'
caminho = '/nome/ruim/'
# Símbolos (são objetos)
# Símbolos são imutáveis, são constantes reutilizáveis representadadas internamente por um
# valor inteiro. Eles são frequentemente usados no lugar de strings para transmitir com eficiência os valores
# específicos e significativos
# Símbolos são imutáveis, são constantes reutilizáveis representadadas
# internamente por um valor inteiro. Eles são frequentemente usados no
# lugar de strings para transmitir com eficiência os valores específicos
# e significativos
:pendente.class #=> Symbol

View File

@@ -4,7 +4,7 @@ filename: learnclojure-ru.clj
contributors:
- ["Adam Bard", "http://adambard.com/"]
- ["Alexey Pirogov", "http://twitter.com/alex_pir"]
lang: ru-ru
---
Clojure, это представитель семейства Lisp-подобных языков, разработанный

View File

@@ -88,7 +88,8 @@ $unescaped = 'This just contains a slash and a t: \t';
// Заключайте переменные в фигурные скобки если это необходимо
$money = "I have $${number} in the bank.";
// Начиная с PHP 5.3, синтаксис nowdocs может использоваться для неинтерполированного многострочного текста
// Начиная с PHP 5.3, синтаксис nowdocs может использоваться для
// неинтерполированного многострочного текста
$nowdoc = <<<'END'
Multi line
string
@@ -210,11 +211,13 @@ echo $integer + $integer; // => 2
$string = '1';
echo $string + $string; // => 2 (строка превращается в число)
// Выводится 0 по той причине, что оператор + не может привести строку 'one' к числовому типу
// Выводится 0 по той причине, что оператор + не может привести строку 'one' к
// числовому типу
$string = 'one';
echo $string + $string; // => 0
// Приведение типов (type casting) может быть использовано для преобразование переменной в другой тип
// Приведение типов (type casting) может быть использовано для преобразование
// переменной в другой тип
$boolean = (boolean) 1; // => true
$zero = 0;
@@ -429,10 +432,11 @@ return 'Anything you like.';
// Эти функции могут также возвращать значения.
$value = include 'my-include.php';
// Имена файлов содержат их путь в файловой системе, или если передано просто имя файла,
// PHP обращается к директиве include_path. Если файл не найден в include_path, предпринимается
// попытка поиска в папке, где выполняется скрипт или в текущей рабочей директории.
// Если не в одном из этих мест файл не найден - выдается ошибка
// Имена файлов содержат их путь в файловой системе, или если передано просто
// имя файла, PHP обращается к директиве include_path. Если файл не найден в
// include_path, предпринимается попытка поиска в папке, где выполняется скрипт
// или в текущей рабочей директории. Если не в одном из этих мест файл не
// найден - выдается ошибка
/* */
/********************************

View File

@@ -1,5 +1,6 @@
---
language: python
lang: ru-ru
contributors:
- ["Yury Timofeev", "http://twitter.com/gagar1n"]
filename: learnpython-ru.py
@@ -219,7 +220,8 @@ filled_dict["four"] # KeyError
# Чтобы избежать этого, используйте метод get
filled_dict.get("one") #=> 1
filled_dict.get("four") #=> None
# Метод get также принимает аргумент default, значение которого будет возвращено при отсутствии указанного ключа
# Метод get также принимает аргумент default, значение которого будет
# возвращено при отсутствии указанного ключа
filled_dict.get("one", 4) #=> 1
filled_dict.get("four", 4) #=> 4
@@ -314,7 +316,9 @@ try:
# Для выбора ошибки используется raise
raise IndexError("Это IndexError")
except IndexError as e:
pass # pass это просто отсутствие оператора. Обычно здесь происходит восстановление от ошибки.
# pass это просто отсутствие оператора. Обычно здесь происходит
# восстановление от ошибки.
pass
####################################################

View File

@@ -29,7 +29,8 @@ import (
"strconv" // 字符串转换
)
//函数声明Main是程序执行的入口。不管你喜欢还是不喜欢反正G就用了花括号来包住函数体。
// 函数声明Main是程序执行的入口。
// 不管你喜欢还是不喜欢反正G就用了花括号来包住函数体。
func main() {
// 往标准输出打印一行。
// 用包名fmt限制打印函数。
@@ -125,7 +126,8 @@ func learnFlowControl() {
if true {
fmt.Println("told ya")
}
// 用go fmt 命令可以帮你格式化代码,所以不用怕被人吐槽代码风格了,也不用容忍被人的代码风格。
// 用go fmt 命令可以帮你格式化代码,所以不用怕被人吐槽代码风格了,
// 也不用容忍被人的代码风格。
if false {
// pout
} else {
@@ -196,7 +198,8 @@ func learnInterfaces() {
// 调用i的String方法输出和上面一样
fmt.Println(i.String())
// fmt包中的Println函数向对象要它们的string输出实现了String方法就可以这样使用了。类似java中的序列化
// fmt包中的Println函数向对象要它们的string输出实现了String方法就可以这样使用了。
// 类似java中的序列化
fmt.Println(p) // 输出和上面一样自动调用String函数。
fmt.Println(i) // 输出和上面一样。
@@ -229,7 +232,8 @@ func inc(i int, c chan int) {
func learnConcurrency() {
// 用make来声明一个slicemake会分配和初始化slicemap和channel。
c := make(chan int)
// 用go关键字开始三个并发的goroutine如果机器支持的话还可能是并行执行。三个都被发送到同一个channel。
// 用go关键字开始三个并发的goroutine如果机器支持的话还可能是并行执行。
// 三个都被发送到同一个channel。
go inc(0, c) // go is a statement that starts a new goroutine.
go inc(10, c)
go inc(-805, c)
@@ -241,7 +245,8 @@ func learnConcurrency() {
cc := make(chan chan string) // 操作channel的channel
go func() { c <- 84 }() // 开始一个goroutine来发送一个新的数字
go func() { cs <- "wordy" }() // 发送给cs
// Select类似于switch但是每个case包括一个channel操作。它随机选择一个准备好通讯的case。
// Select类似于switch但是每个case包括一个channel操作。
// 它随机选择一个准备好通讯的case。
select {
case i := <-c: // 从channel接收的值可以赋给其他变量
fmt.Println("it's a", i)