Как называть переменные c
Перейти к содержимому

Как называть переменные c

  • автор:

Переменные в языке Си. Объявление переменной в Си

Чтобы хранить в своей программе какие-либо данные, вам понадобятся переменные. Прежде всего, нужно научиться эти переменные в программе создавать. Другими словами, вспоминая нашу аналогию с коробками, чтобы в коробку что-то положить, её, эту самую коробку, хорошо бы сначала где-нибудь раздобыть.

В книжках по программированию процесс создания переменной называют объявлением переменной . Это словосочетание хорошо бы знать, чтобы понимать профессиональную литературу и речь других программистов. Но ещё более важно понимать, что за этим словосочетанием скрывается.

Как объявить переменную?

Для того чтобы объявить переменную, необходимо указать её тип и записать её имя. Ну и не забыть поставить «;». Общая стуктура объявления переменной показана на следующем рисунке.

Общий синтаксис объявления переменной

Рис.1. Общий синтаксис объявления переменной.».

В примере на рисунке мы создаём переменную с именем num, в которой можно будет хранить целые числа. На то, что мы собираемся использовать переменную для хранения целых чисел, указывает тип данных int.

Ещё парочка примеров:

Листинг 1. Объявление переменных

int z; // переменная z целого типа char w; // переменная w символьного типа

Для имён переменных есть одно правило, которое надо будет запомнить.

В качестве имени переменной может выступать любая последовательность символов латинского алфавита, цифр и знака нижнего подчеркивания «_», которая начинается с буквы.

На самом деле, на имя переменной есть дополнительные ограничения, но мы пока в такие детали вдаваться не будем. Давайте лучше посмотрим на примеры правильных и неправильных имён.

Правильные имена переменных

Peremennaya, flag, f3, var4, KolichestvoBukv, fd4s, FLaG, key_number

Неправильные имена переменных

2num – начинается с цифры
num flat – содержит пробел в имени
nomer-telefona – содержит дефис

И ещё один важный момент. В языке программирования Си регистр букв очень важен. Например, переменные с именами flag, FLAG, FlAg, fLAg — это всё различные переменные. Кроме того, есть ряд слов, которые нельзя использовать для названия переменных. Например, int, void, return и другие. Это специальные ключевые слова , которые зарезервированы для нужд самого языка и нигде в другом месте не могут быть использованы.

Кстати, за одно объявление можно создать сразу несколько переменных одного типа.

Листинг 2. Объявление нескольких переменных

int a,c; // объявляем переменные a и c целого типа double x, y, z; // объявляем сразу три вещественные переменные

Всё просто и логично. Сначала указывает тип переменных, а потом их имена, разделённые запятой.

Переменная в памяти компьютера.

Пару слов о том, как выглядит объявление переменной с точки зрения компьютера.

Можно считать, что при объявлении мы сообщаем компьютеру, чтобы он выделил под переменную место в памяти и связал это место определенным именем. Количество места, которое будет выделено в памяти для хранения переменной, зависит от типа этой переменной. Проиллюстрируем эту мысль следующим рисунком.

Листинг 3. Объявление двух переменных

int w; // объявляем целочисленной переменной w double z; // объявляем вещественной переменной z

 Переменные в памяти компьютера

Рис.3. Переменные в памяти компьютера.

На рисунке условно изображена память компьютера как набор ячеек, в каждой из которых может что-то храниться. При этом вещественная переменная занимает две ячейки, а целочисленная всего одну. Это соотношение (два к одному) условное. На самом деле, в вашем компьютере переменная вещественного типа может занимать, например, в четыре раза больше места в памяти, чем целочисленная переменная.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи: Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров

  1. Объявите в программе переменную с неправильным именем и попробуйте скомпилировать программу. Посмотрите, какую ошибку выдаст компилятор.
  2. Найдите список всех ключевых слов языка Си. Можно искать в стандарте языка(подсказка: «keywords»), а можно в интернете. Запоминать наизусть их не нужно, но разок посмотреть на них стоит.

Дополнительные материалы

  • В ваших программах не стесняйтесь давать переменным длинные имена. Хорошо, если по имени переменной можно будет сразу понять, что в ней хранится. Есть два основных способа записи длинных имён переменных: ВерблюжьяНотация и змеиная_нотация. Подробнее о плюсах и минусах обоих подходов можно почитать по следующим ссылкам: Хабрахабр и Типичный программист.

Как называть переменные

Для меня основной критерий хорошего когда — его читаемость. Поэтому важно чтобы переменные, функции и методы легко читались и понимались. Далее я расскажу как я называю переменные и что мне в этом помогает.

Строки

Традиционно название строковой переменной — существительное. Как и везде, мы должны понимать что находится в переменной по её названию. Со строкой сложно напортачить, используйте существительные и давайте более осмысленные имена, например:

const serverMessage = 'hello from server' const componentHtml = '

Hello

' const login = 'username' const password = 'qwerty' const ACCESS_TOKEN = 'xxxxx'

Числа

  • код чего-либо (code)
  • размер (size, length)
  • номер (number)
  • количество (count)

Использование этих слов привычно и не вызывает дополнительных вопросов:

const keyCode = 17 const numberFromEnd = 10 const maxWindowSize = 800 const minCharacterLength = 10 const newMessageCount = 2 

Булевое значение

Лучшее название для булевой переменной — вопрос с ответом да-нет. Так-же часто встречаются в виде префиксов и суфиксов слова:

  • это (is)
  • содержит (has/contain)
  • может (can)
  • должен (shoud)
  • возможность (able)
const isPopupOpen = true; const hasUpperLetters = true; const containsObject = false; const shouldUpdate = false; const disabled = true; 

Массивы

Массивы это существительные во множественном числе. Оканчиваются на суффиксы s и es.

const users = [ name: 'Yury'>]; const letters = ['A', 'B', 'C']; const codes = [21, 37]; 

Объекты

Так-же как и строки. Мне это не очень нравится, т.к. нельзя сразу-же отличить строку от объекта. Можно добавлять суффикс obj, но это мне кажется уже лишним.

Важное правило, не дублируйте название объекта в названии свойства или метода:

// Плохо const user =  userName: 'test', getUsername() <>, >; // Хорошо const user =  name: 'test', getName() <>, >; 

Функции и методы

Для функций первое слово глагол:

  • init/initialize
  • compute
  • find
  • create (object, array…)
  • to (string, array…)
  • filter
const initApp = () => <>; const computeMaxHeight = () => <>; const findClosestElement = () => <>; const toString = () => <>; const filterUsers = () => <>; 

Симметричные пары

Общие:

  • old/new
  • begin/end
  • first/last
  • up/down
  • min/max
  • next/previous

Для функций:

  • get/set
  • add/remove
  • create/destroy
  • start/stop
  • insert/delete
  • increment/decrement
  • open/close
  • show/hide
  • suspend/resume

Если вы новичек в программировании, или плохо знакомы с английским языком, то вот вам лайфхак:

  1. Хорошо подумайте и назовите переменную на русском языке
  2. Переведите её через Google Translate

Это все что я хотел сказать о переменных. Для дополнительного чтения советую статью 90 рекомендаций по стилю написания программ на C++.

Я что-то забыл или где-то ошибся, напишите об этом в комментариях. Спасибо.

Еше можно подписаться на email рассылку новых заметок. Не чаще раза в неделю, без спама.

Код. Плейсхолдер для [contenteditable]

Код. Плейсхолдер для [contenteditable]

Placeholder полифил для contenteditable элемента

Плавный, нативный скрол

Плавный, нативный скрол

Выкиньте лишние библиотеки для прокрутки внутри страницы

Лайфхак. Номер телефона на сайте

Лайфхак. Номер телефона на сайте

Надоели звонки от клиентов в 2 часа ночи? Покажите номер телефона на сайте только в рабочее время. Подробности в статье.

На чем тестировать JavaScript фреймворки

На чем тестировать JavaScript фреймворки

На чем испробовать новую технологию или фреймоврк если нет сайд/пет проекта? Пара интересных задачек в этой заметке.

Переменные

Теги: Си переменные. char, int, unsigned, long, long long, float, double, long double, long float, lexical scoping. Объявление переменных. Область видимости. Инициализация переменных. Имена переменных. Экспоненциальная форма.

Переменные

П еременные используются для хранения значений (sic!). Переменная характеризуется типом и именем. Начнём с имени. В си переменная может начинаться с подчерка или буквы, но не с числа. Переменная может включать в себя символы английского алфавита, цифры и знак подчёркивания. Переменная не должна совпадать с ключевыми словами (это специальные слова, которые используются в качестве управляющих конструкций, для определения типов и т.п.)

А также ряд других слов, специфичных для данной версии компилятора, например far, near, tiny, huge, asm, asm_ и пр.

Например, правильные идентификаторы
a, _, _1_, Sarkasm, a_long_variable, aLongVariable, var19, defaultX, char_type
неверные
1a, $value, a-long-value, short

Си — регистрозависимый язык. Переменные с именами a и A, или end и END, или perfectDark и PerfectDarK – это различные переменные.

Типы переменных

  • 1) Размер переменной в байтах (сколько байт памяти выделит компьютер для хранения значения)
  • 2) Представление переменной в памяти (как в двоичном виде будут расположены биты в выделенной области памяти).

Целые

  • char — размер 1 байт. Всегда! Это нужно запомнить.
  • short — размер 2 байта
  • int — размер 4 байта
  • long — размер 4 байта
  • long long — размер 8 байт.

Указанные выше значения характерны для компилятора VC2012 на 32-разрядной машине. Так что, если ваша программа зависит от размера переменной, не поленитесь узнать её размер.

Теперь давайте определим максимальное и минимальное число, которое может хранить переменная каждого из типов. Числа могут быть как положительными, так и отрицательными. Отрицательные числа используют один бит для хранения знака. Иногда знак необходим (например, храним счёт в банке, температуру, координату и т.д.), а иногда в нём нет необходимости (вес, размер массива, возраст человека и т.д.). Для этого в си используется модификатор типа signed и unsigned. unsigned char — все 8 бит под число, итого имеем набор чисел от 00000000 до 11111111 в двоичном виде, то есть от 0 до 255 signed char от -128 до 128. В си переменные по умолчанию со знаком. Поэтому запись char и signed char эквивалентны.

Таб. 1 Размер целых типов в си.

Тип Размер, байт Минимальное значение Максимальное значение
unsigned char 1 0 255
signed char
( char )
1 -128 127
unsigned short 2 0 65535
signed short
( short )
2 -32768 32767
unsigned int
( unsigned )
4 0 4294967296
signed int
( int )
4 -2147483648 2147483647
unsigned long 4 0 4294967296
signed long
( long )
4 -2147483648 2147483647
unsigned long long 8 0 18446744073709551615
signed long long
( long long )
8 -9223372036854775808 9223372036854775807

sizeof

В си есть оператор, который позволяет получить размер переменной в байтах. sizeof переменная, или sizeof(переменная) или sizeof(тип). Это именно оператор, потому что функция не имеет возможности получить информацию о размере типов во время выполнения приложения. Напишем небольшую программу чтобы удостовериться в размерах переменных.

#include #include int main() < char c; short s; int i; long l; long long L; //Вызов sizeof как "функции" printf("sizeof(char) = %d\n", sizeof(c)); printf("sizeof(short) = %d\n", sizeof(s)); printf("sizeof(int) = %d\n", sizeof(i)); printf("sizeof(long) = %d\n", sizeof(l)); printf("sizeof(long long) = %d\n", sizeof(L)); //Вызов как оператора printf("sizeof(char) = %d\n", sizeof c); printf("sizeof(short) = %d\n", sizeof s); printf("sizeof(int) = %d\n", sizeof i); printf("sizeof(long) = %d\n", sizeof l); printf("sizeof(long long) = %d\n", sizeof L); _getch(); >

(Я думаю ясно, что переменные могут иметь любое валидное имя). Эту программу можно было написать и проще

#include #include int main() < printf("sizeof(char) = %d\n", sizeof(char)); printf("sizeof(short) = %d\n", sizeof(short)); printf("sizeof(int) = %d\n", sizeof(int)); printf("sizeof(long) = %d\n", sizeof(long)); printf("sizeof(long long) = %d\n", sizeof(long long)); //нельзя произвести вызов sizeof как оператора для имени типа //sizeof int - ошибка компиляции _getch(); >

В си один и тот же тип может иметь несколько названий
short === short int
long === long int
long long === long long int
unsigned int === unsigned

Типы с плавающей точкой

  • float — 4 байта,
  • long float — 8 байт
  • double — 8 байт
  • long double — 8 байт.
Таб. 2 Размер типов с плавающей точкой в си.

Тип Размер, байт Количество значащих знаков мантиссы Минимальное значение Максимальное значение
float 4 6-7 1.175494351 E – 38 3.402823466 E + 38
double 8 15-16 2.2250738585072014 E – 308 1.7976931348623158 E + 308

Переполнение переменных

Си не следит за переполнением переменных. Это значит, что постоянно увеличивая значение, скажем, переменной типа int в конце концов мы «сбросим значение»

#include #include void main() < unsigned a = 4294967295; int b = 2147483647; //Переполнение беззнакового типа printf("%u\n", a); a += 1; printf("%u", a); //Переполнение знакового типа printf("%d\n", b); b += 1; printf("%d", b); getch(); >

Вообще, поведение при переполнении переменной определено только для типа unsigned: Беззнаковое целое сбросит значение. Для остальных типов может произойти что угодно, и если вам необходимо следить за переполнением, делайте это вручную, проверяя аргументы, либо используйте иные способы, зависящие от компилятора и архитектуры процессора.

Постфиксное обозначение типа

  • 11 — число типа int
  • 10u — unsigned
  • 22l или 22L — long
  • 3890ll или 3890LL — long long (а также lL или Ll)
  • 80.0f или 80.f или 80.0F — float (обязательно наличие десятичной точки в записи)
  • 3.0 — число типа double

#include #include int main()

Следующий код, однако, не будет приводить к ошибкам, потому что происходит неявное преобразование типа

int a = 10u; double g = 3.f;

Шестнадцатеричный и восьмеричный формат

В о время работы с числами можно использовать шестнадцатеричный и восьмеричный формат представления. Числа в шестнадцатиричной системе счисления начинаются с 0x, в восьмеричной системе с нуля. Соответственно, если число начинается с нуля, то в нём не должно быть цифр выше 7:

#include #include void main()

Экспоненциальная форма представления чисел

Э кспоненциальной формой представления числа называют представление числа в виде M e ± p , где M — мантиса числа, p — степень десяти. При этом у мантисы должен быть один ненулевой знак перед десятичной запятой.
Например 1.25 === 1.25e0, 123.5 === 1.235e2, 0.0002341 === 2.341e-4 и т.д.
Представления 3.2435e7 эквивалентно 3.2435e+7
Существеут и другое представление («инженерное»), в котором степень должна быть кратной тройке. Например 1.25 === 1.25e0, 123.5 === 123.5e0, 0.0002341 === 234.1e-6, 0.25873256 === 258.73256e-3 и т.д.

Объявление переменных

В си переменные объявляются всегда в начале блока (блок — участок кода ,ограниченный фигурными скобками)

При объявлении переменной пишется её тип и имя.

int a; double parameter;

Можно объявить несколько переменных одного типа, разделив имена запятой

long long arg1, arg2, arg3;
#include #include int main() < int a = 10; int b; while (a>0) < int z = a*a; b += z; >>

Здесь объявлены переменные a и b внутри функции main, и переменная z внутри тела цикла. Следующий код вызовет ошибку компиляции

int main()

Это связано с тем, что объявление переменной стоит после оператора присваивания. При объявлении переменных можно их сразу инициализировать.
int i = 0;
При этом инициализация при объявлении переменной не считается за отдельный оператор, поэтому следующий код будет работать

int main()

Начальное значение переменной

О чень важно запомнить, что переменные в си не инициализируются по умолчанию нулями, как во многих других языках программирования. После объявления переменной в ней хранится «мусор» — случайное значение, которое осталось в той области памяти, которая была выделена под переменную. Это связано, в первую очередь, с оптимизацией работы программы: если нет необходимости в инициализации, то незачем тратить ресурсы для записи нулей (замечание: глобальные переменные инициализируются нулями, почему так, читайте в этой статье).

#include #include int main()

Если выполнять эту программу на VC, то во время выполнения вылетит предупреждение
Run-Time Check Failure #3 — The variable ‘i’ is being used without being initialized.
Если нажать «Продолжить», то программа выведет «мусор». В многих других компиляторах при выполнении программы не будет предупреждения.

Область видимости переменной

П еременные бывают локальными (объявленными внутри какой-нибудь функции) и глобальными. Глобальная переменная видна всем функциям, объявленным в данном файле. Локальная переменная ограничена своей областью видимости. Когда я говорю, что переменная «видна в каком-то месте», это означает, что в этом месте она определена и её можно использовать. Например, рассмотрим программу, в которой есть глобальная переменная

#include #include int global = 100; void foo() < printf("foo: %d\n", global); >void bar(int global) < printf("bar: %d\n", global); >int main()

Будет выведено
foo: 100
bar: 333
Здесь глобальная переменная global видна всем функциям. Но аргумент функции затирает глобальную переменную, поэтому при передаче аргумента 333 выводится локальное значение 333.
Вот другой пример

#include #include int global = 100; int main()

Программа выведет 555. Также, как и в прошлом случае, локальная переменная «важнее». Переменная, объявленная в некоторой области видимости не видна вне её, например

#include #include int global = 100; int main() < int x = 10; < int y = 30; printf("%d", x); >printf("%d", y); >

Этот пример не скомпилируется, потому что переменная y существует только внутри своего блока.
Вот ещё пример, когда переменные, объявленные внутри блока перекрывают друг друга

#include #include int global = 100; int main() < int x = 10; < int x = 20; < int x = 30; printf("%d\n", x); >printf("%d\n", x); > printf("%d\n", x); getch(); >

Программа выведет
30
20
10
Глобальных переменных необходимо избегать. Очень часто можно услышать такое. Давайте попытаемся разобраться, почему. В ваших простых проектах глобальные переменные выглядят вполне нормально. Но представьте, что у вас приложение, которое

  • 1) Разрабатывается несколькими людьми и состоит из сотен тысяч строк кода
  • 2) Работает в несколько потоков

Во-первых, глобальная переменная, если она видна всем, может быть изменена любой частью программы. Вы изменили глобальную переменную, хотите её записать, а другая часть программы уже перезаписала в неё другое значение (на самом деле это целый класс проблем, которые возникают в многопоточной среде). Во-вторых, при больших размерах проекта не уследить, кто и когда насоздавал глобальных переменных. В приведённых выше примерах видно, как переменные могут перекрывать друг друга, то же произойдёт и в крупном проекте.

Безусловно, есть ситуации, когда глобальные переменные упрощают программу, но такие ситуации случаются не часто и не в ваших домашних заданиях, так что НЕ СОЗДАВАЙТЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ!
Переменные могут быть не только целочисленными и с плавающей точкой. Существует множество других типов, которые мы будем изучать в дальнейшем.

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

email

Всё ещё не понятно? – пиши вопросы на ящик

C++: Именование переменных

age или number — пример простого имени, но не все имена так просты. Довольно часто они составные, то есть включают в себя несколько слов. Например, «имя пользователя». В разных языках применяются разные стили кодирования, и имя переменной будет отличаться.

В именовании переменных можно выделить три основных подхода, которые иногда комбинируют друг с другом. Все эти подходы проявляют себя, когда имя переменной состоит из нескольких слов:

  • kebab-case — составные части переменной разделяются дефисом. Например: my-super-var .
  • snake_case — для разделения используется подчеркивание. Например: my_super_var .
  • CamelCase — каждое слово в переменной пишется с заглавной буквы. Например: MySuperVar .
  • lowerCamelCase — каждое слово в переменной пишется с заглавной буквы, кроме первого. Например: mySuperVar .

В C++ используется смешанный стиль именования:

  • переменные — пишем в стиле snake_case. Например: current_user .
  • константы — пишем в стиле CamelCase добавляя префикс k . Например: const int kDaysInAWeek = 2 .
  • классы — пишем в стиле CamelCase. Например: MySuperClass .
  • функции — пишем также как и классы в стиле CamelCase. Например: OpenFile() .
  • файлы — именуются строчными буквами, для разделения можно использовать подчеркивание или дефис. Основные файлы должны иметь расширение .сс, заголовочные .h

Задание

Создайте две переменные с именами «первое число» и «второе число» на английском языке, используя snake_case. Запишите в первую переменную число 11 , во вторую — -100 . Выведите на экран произведение чисел, записанных в получившихся переменных.

Код будет работать с любыми названиями, а наша система всегда проверяет только результат на экране, поэтому выполнение этого задания — под вашу ответственность.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

  • Google C++ style guide
  • Заголовочные файлы

Определения

  • Стандарт кодирования — Набор синтаксических и стилистических правил написания кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *