以下定义实际上在做什么?

时间:2015-02-16 05:24:59

标签: c arrays

在SO的一个问题中,我遇到了下面的定义:

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

我知道rand() % 26会给出0到25之间的随机数。 但是在上面的定义中实际发生了什么?当评估表达式时(编译时或运行时)?堆栈的内容是什么。

我们在C中称之为这样的定义。这个特征是什么?

3 个答案:

答案 0 :(得分:8)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26];是一个表达式,用作randchar的初始化。

  • "ABCDEFGHIJKLMNOPQRSTUVWXYZ"是一个包含27个char(26个字母和一个空终止符)的数组。
  • 方括号是数组索引运算符。
  • rand()生成随机数
  • rand() % 26将其转换为025(含)之间的数字
  • 该结果用作数组索引。
  • 数组中的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()会在0RAND_MAX之间返回一个伪随机数,通常至少为0xffff - 即大于26。

x % 26以模数26返回x

所以完整语句:获取一个随机数,当除以26时取其余数,得到0-25范围内的数字,并使用该数字查找字符串文字中的字符,即字符串文字是大写的英文字母。即它选择一个随机的大写英文字母。