模运算符应用于字符算术时意味着什么?
What does the modulo operator mean when applied to character arithmetic?
symbol = (rand() % ('~' - ' ' + 1)) + ' ';
我了解到每次 运行 程序 "symbol" 都不一样。但是,为什么我不能使用
symbol = rand();
的 Ascii
~
是 126
space
是 32
所以symbol = (rand() % ('~' - ' ' + 1)) + ' ';
等同于:
symbol = (rand() % (126 - 32 + 1)) + 32;
它给你一个介于32
和126
之间的随机数
C99 7.20.2.1
The rand
function computes a sequence of pseudo-random integers in the
range 0 to RAND_MAX.
The value of the RAND_MAX macro shall be at least 32767.
如果您想要介于 0 和 min(max(32767,RAND_MAX),TYPE_SYMBOL_MAX) 并且只要 symbol
的类型允许 。
没有所谓的字符算术 注意 (AFAIK) 和 modulo operator 意味着这是平常的事情。你似乎对整个表达感到困惑。
根据 ASCII table
~
的十进制值为 126
</code> 的十进制值为 32。</li>
</ul>
<p><code>rand()
的输出将在 space 范围内取模值,从而产生 printable representation .
分解,
('~' - ' ' + 1)
== 126-32 +1
== 95
(rand() % ('~' - ' ' + 1))
产生一个介于 0-94
. 之间的随机数
(rand() % ('~' - ' ' + 1)) + ' '
生成介于 32-126
之间的随机数,这是可打印范围。
why I can't use symbol = rand();
好吧,那句话没有错,但看起来目的是产生一个 可打印 symbol
值。
注:
引用 C11
,章节 §6.4.4.4
An integer character constant is a sequence of one or more multibyte characters enclosed
in single-quotes, as in 'x'. [...]
并且,
An integer character constant has type int
. [...]
所以,一直都是整数运算。
C 中的字符常量是整数。所以如下:
('~' - ' ' + 1)
计算 '~'
的编码与 ' '
的编码的偏移量并加一。就是它们之间有多少种不同的字符编码,我们称这个数字为m
.
(rand() % ('~' - ' ' + 1))
取一个伪随机数并将其映射到范围[0, m)
,让我们调用that number n
.
(rand() % ('~' - ' ' + 1)) + ' '
这只是简单地取n
,把它当作一个偏移量,并将它添加到' '
的编码中,从而得到一个符号的编码。该符号将始终是特定集合中的一个。
symbol = rand();
上面的代码会将可能位于 char
范围之外的整数转换为某个字符值。这将以某种实现定义的方式完成。至少可以说,这不是获得正确结果的最可靠方法。
symbol = (rand() % ('~' - ' ' + 1)) + ' ';
我了解到每次 运行 程序 "symbol" 都不一样。但是,为什么我不能使用
symbol = rand();
~
是 126space
是 32
所以symbol = (rand() % ('~' - ' ' + 1)) + ' ';
等同于:
symbol = (rand() % (126 - 32 + 1)) + 32;
它给你一个介于32
和126
C99 7.20.2.1
The
rand
function computes a sequence of pseudo-random integers in the range 0 to RAND_MAX.The value of the RAND_MAX macro shall be at least 32767.
如果您想要介于 0 和 min(max(32767,RAND_MAX),TYPE_SYMBOL_MAX) 并且只要 symbol
的类型允许 。
没有所谓的字符算术 注意 (AFAIK) 和 modulo operator 意味着这是平常的事情。你似乎对整个表达感到困惑。
根据 ASCII table
~
的十进制值为 126</code> 的十进制值为 32。</li> </ul> <p><code>rand()
的输出将在 space 范围内取模值,从而产生 printable representation .分解,
('~' - ' ' + 1)
==126-32 +1
==95
(rand() % ('~' - ' ' + 1))
产生一个介于0-94
. 之间的随机数
(rand() % ('~' - ' ' + 1)) + ' '
生成介于32-126
之间的随机数,这是可打印范围。
why I can't use
symbol = rand();
好吧,那句话没有错,但看起来目的是产生一个 可打印
symbol
值。
注:
引用
C11
,章节 §6.4.4.4An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'. [...]
并且,
An integer character constant has type
int
. [...]所以,一直都是整数运算。
C 中的字符常量是整数。所以如下:
('~' - ' ' + 1)
计算 '~'
的编码与 ' '
的编码的偏移量并加一。就是它们之间有多少种不同的字符编码,我们称这个数字为m
.
(rand() % ('~' - ' ' + 1))
取一个伪随机数并将其映射到范围[0, m)
,让我们调用that number n
.
(rand() % ('~' - ' ' + 1)) + ' '
这只是简单地取n
,把它当作一个偏移量,并将它添加到' '
的编码中,从而得到一个符号的编码。该符号将始终是特定集合中的一个。
symbol = rand();
上面的代码会将可能位于 char
范围之外的整数转换为某个字符值。这将以某种实现定义的方式完成。至少可以说,这不是获得正确结果的最可靠方法。