symbol = (rand() % ('~' - ' ' + 1)) + ' ';
我明白每次运行程序“符号”都是不同的。但是,为什么我不能使用
symbol = rand();
答案 0 :(得分:2)
没有什么叫字符算术 注意(AFAIK),而modulo operator意味着它是通常的业务。你似乎感到困惑的是关于整个表达。
~
的小数值为126
的小数值为32。 rand()
的输出将按空间上的范围进行模数加值,以生成printable representation。
要打破它,
('~' - ' ' + 1)
== 126-32 +1
== 95
(rand() % ('~' - ' ' + 1))
会在0-94
之间生成一个随机数。(rand() % ('~' - ' ' + 1)) + ' '
会产生32-126
之间的随机数,这是可打印的范围。为什么我无法使用
symbol = rand();
嗯,该声明没有错,但看起来目的是产生可打印的 symbol
值。
注意:
引用C11
,章节§6.4.4.4
整数字符常量是包含的一个或多个多字节字符的序列 在单引号中,如'x'。 [...]
和
整数字符常量的类型为
int
。 [...]
所以,它一直是整数运算。
答案 1 :(得分:1)
的Ascii
~
是126
space
是32
所以symbol = (rand() % ('~' - ' ' + 1)) + ' ';
相当于:
symbol = (rand() % (126 - 32 + 1)) + 32;
在32
和126
C99 7.20.2.1
rand
函数计算一系列伪随机整数 范围0到RAND_MAX 。RAND_MAX 宏的值应至少32767 。
如果您想要 0 和 min(最大值(32767,RAND_MAX),TYPE_SYMBOL_MAX)之间的范围,并且只要,则可以使用symbol=rand()
> symbol
允许的类型。
答案 2 :(得分:1)
C中的字符常量是整数。以下是:
('~' - ' ' + 1)
从'~'
的编码计算' '
的编码偏移量,并为其添加一个。它们之间有多少不同的字符编码,让我们称之为m
。
(rand() % ('~' - ' ' + 1))
采用伪随机数并将其映射到范围[0, m)
,让我们调用 号n
。
(rand() % ('~' - ' ' + 1)) + ' '
这只需要n
,将其视为偏移量,并将其添加到' '
的编码中,从而获得符号的编码。符号将始终是某个集合之一。
symbol = rand();
上面会将一个整数(可能位于char
范围之外)转换为某个字符值。这将以某种实现定义的方式完成。至少可以说,这不是获得正确结果的最可靠方法。