2015-02-16 6 views
3

В одном из вопросов SO, я наткнулся ниже Defination:Что на самом деле означает определение?

char randchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26]; 

Я знаю, что rand() % 26 даст случайное число от 0 до 25. Но что на самом деле происходит в приведенное выше определение? Когда выражение оценивается (время компиляции или время выполнения)? Каким будет содержимое стека.

Что мы называем такими определениями в C.Какой функцией является это?

+1

Разве вы не можете просто бежать и видеть это? – Abhineet

+0

Я запускал его, но я хочу знать, что происходит за кулисами, с точки зрения распределения памяти и т. Д.(запустите его в онлайн-компиляторе) – Vagish

ответ

8

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26]; - это выражение, которое используется как инициализированное для randchar.

  • "ABCDEFGHIJKLMNOPQRSTUVWXYZ" представляет собой массив из 27 char (26 букв и нулевой терминатор).
  • Квадратные скобки являются оператором индексирования массива.
  • rand() генерирует случайное число
  • rand() % 26 преобразует что число между 0 и 25 (включительно)
  • Этот результат используется в качестве индекса массива.
  • char в массиве копируется в randchar.

Это могло быть написано:

char const letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
int random_number = rand() % 26; 

char randchar = letters[random_number]; 
+0

Спасибо, Итак, '' ABCDEFGHIJKLMNOPQRSTUVWXYZ'' хранится в стеке или в текстовом сегменте? Или это компилятор, независимо от того, следует ли объявлять строку как массив из const или нет. – Vagish

+2

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

+0

@Vagish. Поскольку это буквально, оно должно быть в доступном для чтения месте. – Gopi

3

Приведенный выше код эквивалентен

char arr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
char randchar = arr[rand() % 26]; 

В основном в вашем случае, то, что делается это число, генерируемое выражением rand() % 26 является используется как индекс unnamed массив "ABCDEFGHIJKLMNOPQRSTUVWXYZ", чтобы получить значение определенного элемента.

0

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" - это строковый литерал. Таким образом, это массив из char с завершающим NULL.

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[x] - символ, расположенный в позиции x внутри строки, в предположении, что x находится в пределах границ и не определено иначе.

rand() возвращает псевдо-случайное число между 0 и RAND_MAX, который, как правило, по крайней мере 0xffff - то есть много больше, чем 26.

x % 26 возвращает x по модулю 26.

Так полный текст заявления: получающий случайное число, берет остаток от него при делении на 26, чтобы дать число в диапазоне 0-25, и использует это число для поиска символа в строковом литерале, этот строковый литерал является заглавным английским алфавитом. то есть выбирает случайную букву на английском языке.

Смежные вопросы