summaryrefslogtreecommitdiffhomepage
path: root/ru-ru/c-ru.html.markdown
diff options
context:
space:
mode:
Diffstat (limited to 'ru-ru/c-ru.html.markdown')
-rw-r--r--ru-ru/c-ru.html.markdown40
1 files changed, 19 insertions, 21 deletions
diff --git a/ru-ru/c-ru.html.markdown b/ru-ru/c-ru.html.markdown
index f7b1477b..f376054d 100644
--- a/ru-ru/c-ru.html.markdown
+++ b/ru-ru/c-ru.html.markdown
@@ -60,7 +60,7 @@ int main() {
// long как правило занимает от 4 до 8 байт
// long long занимает как минимум 64 бита
long x_long = 0;
- long long x_long_long = 0;
+ long long x_long_long = 0;
// float это 32-битное число с плавающей точкой
float x_float = 0.0;
@@ -124,7 +124,7 @@ int main() {
// Если между одинарными кавычками есть символ – это символьный литерал,
// но это тип int, а не char (по историческим причинам).
-
+
int cha = 'a'; // хорошо
char chb = 'a'; // тоже хорошо (подразумевается преобразование int в char)
@@ -165,7 +165,7 @@ int main() {
// Правильно:
int between_0_and_2 = 0 < a && a < 2;
- // Логика
+ // Логика
!3; // => 0 (логическое НЕ)
!0; // => 1
1 && 1; // => 1 (логическое И)
@@ -206,8 +206,8 @@ int main() {
} // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n");
-
- //Цикл с постусловием
+
+ // Цикл с постусловием
int kk = 0;
do {
printf("%d, ", kk);
@@ -239,12 +239,12 @@ int main() {
exit(-1);
break;
}
-
+
///////////////////////////////////////
// Форматирование вывода
///////////////////////////////////////
- // Каждое выражение в Си имеет тип, но вы можете привести один тип к другому,
+ // Каждое выражение в Си имеет тип, но вы можете привести один тип к другому,
// если хотите (с некоторыми искажениями).
int x_hex = 0x01; // Вы можете назначать переменные с помощью шестнадцатеричного кода.
@@ -259,7 +259,7 @@ int main() {
// Для определения максимального значения типов `char`, `signed char` и `unisigned char`,
// соответственно используйте CHAR_MAX, SCHAR_MAX и UCHAR_MAX макросы из <limits.h>
-
+
// Целые типы могут быть приведены к вещественным и наоборот.
printf("%f\n", (float)100); // %f formats a float
printf("%lf\n", (double)100); // %lf formats a double
@@ -304,8 +304,8 @@ int main() {
// Объявление указателя на int с адресом массива.
int* x_ptr = x_array;
- // x_ptr сейчас указывает на первый элемент массива (со значением 20).
- // Это работает, потому что при обращении к имени массива возвращается
+ // x_ptr сейчас указывает на первый элемент массива (со значением 20).
+ // Это работает, потому что при обращении к имени массива возвращается
// указатель на первый элемент.
// Например, когда массив передаётся в функцию или присваивается указателю, он
// неявно преобразуется в указатель.
@@ -326,7 +326,7 @@ int main() {
printf("%d\n", x_array[1]); // => Напечатает 19
// Вы также можете динамически выделять несколько блоков памяти с помощью
- // функции malloc из стандартной библиотеки, которая принимает один
+ // функции malloc из стандартной библиотеки, которая принимает один
// аргумент типа size_t – количество байт необходимых для выделения.
int *my_ptr = malloc(sizeof(*my_ptr) * 20);
for (xx = 0; xx < 20; xx++) {
@@ -335,16 +335,16 @@ int main() {
// Работа с памятью с помощью указателей может давать неожиданные и
// непредсказуемые результаты.
- printf("%d\n", *(my_ptr + 21)); // => Напечатает кто-нибудь знает, что?
+ printf("%d\n", *(my_ptr + 21)); // => Напечатает кто-нибудь знает, что?
// Скорей всего программа вылетит.
- // Когда вы закончили работать с памятью, которую ранее выделили, вам необходимо
+ // Когда вы закончили работать с памятью, которую ранее выделили, вам необходимо
// освободить её, иначе это может вызвать утечку памяти или ошибки.
free(my_ptr);
- // Строки это массивы символов, но обычно они представляются как
+ // Строки это массивы символов, но обычно они представляются как
// указатели на символ (как указатели на первый элемент массива).
- // Хорошей практикой считается использование `const char *' при объявлении
+ // Хорошей практикой считается использование `const char *' при объявлении
// строчного литерала. При таком подходе литерал не может быть изменён.
// (например "foo"[0] = 'a' вызовет ошибку!)
@@ -460,7 +460,7 @@ void str_reverse_through_pointer(char *str_in) {
void (*f)(char *); // Сигнатура должна полностью совпадать с целевой функцией.
f = &str_reverse; // Присвоить фактический адрес (во время исполнения)
// "f = str_reverse;" тоже будет работать.
- //Имя функции (как и массива) возвращает указатель на начало.
+ // Имя функции (как и массива) возвращает указатель на начало.
(*f)(str_in); // Просто вызываем функцию через указатель.
// "f(str_in);" или вот так
}
@@ -468,10 +468,8 @@ void str_reverse_through_pointer(char *str_in) {
## На почитать
-Лучше всего найдите копию [K&R, aka "The C Programming Language"](https://en.wikipedia.org/wiki/The_C_Programming_Language)
-Это **книга** написанная создателями Си. Но будьте осторожны, она содержит идеи которые больше не считаются хорошими.
-
-Другой хороший ресурс: [Learn C the hard way](http://learncodethehardway.org/c/).
+Лучше всего найдите копию [K&R, она же "The C Programming Language"](https://en.wikipedia.org/wiki/The_C_Programming_Language),
+это книга написанная создателями Си. Но будьте осторожны, она содержит идеи которые больше не считаются хорошими.
Если у вас появился вопрос, почитайте [compl.lang.c Frequently Asked Questions](http://c-faq.com).
@@ -479,4 +477,4 @@ void str_reverse_through_pointer(char *str_in) {
Читаемый код лучше, чем красивый или быстрый код.
Чтобы научиться писать хороший код, почитайте [Linux kernel coding style](https://www.kernel.org/doc/Documentation/CodingStyle).
-[1] http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member
+[1] [http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member](http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member)