模运算符应用于字符算术时意味着什么?

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;

它给你一个介于32126

之间的随机数

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.

如果您想要介于 0min(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 范围之外的整数转换为某个字符值。这将以某种实现定义的方式完成。至少可以说,这不是获得正确结果的最可靠方法。