模数运算符在应用于字符算术时的含义是什么?

时间:2017-02-21 17:31:00

标签: c modulo

symbol = (rand() % ('~' - ' ' + 1)) + ' ';

我明白每次运行程序“符号”都是不同的。但是,为什么我不能使用

symbol = rand();

3 个答案:

答案 0 :(得分:2)

没有什么叫字符算术 注意(AFAIK),而modulo operator意味着它是通常的业务。你似乎感到困惑的是关于整个表达。

根据ASCII table

  • ~的小数值为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;

32126

之间为您提供随机数

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