在SO的一个问题中,我遇到了下面的定义:
char randchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26];
我知道rand() % 26
会给出0到25之间的随机数。
但是在上面的定义中实际发生了什么?当评估表达式时(编译时或运行时)?堆栈的内容是什么。
我们在C中称之为这样的定义。这个特征是什么?
答案 0 :(得分: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];
答案 1 :(得分:3)
以上代码相当于
char arr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char randchar = arr[rand() % 26];
基本上在你的情况下,正在做的是rand() % 26
表达式生成的数字被用作未命名的数组"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
的索引来获取值特定元素。
答案 2 :(得分:1)
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
是一个C字符串文字。因此,它是一个char
数组,其终结符为NULL
。
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[x]
是位于字符串中x
位置的字符,假设x
在边界内,否则未定义。
rand()
会在0
和RAND_MAX
之间返回一个伪随机数,通常至少为0xffff
- 即大于26。
x % 26
以模数26返回x
。
所以完整语句:获取一个随机数,当除以26时取其余数,得到0-25范围内的数字,并使用该数字查找字符串文字中的字符,即字符串文字是大写的英文字母。即它选择一个随机的大写英文字母。