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

C 当应用于字符算术时,模运算符意味着什么?,c,modulo,C,Modulo,我知道每次我运行程序“symbol”都是不同的。但是,为什么我不能使用 symbol = (rand() % ('~' - ' ' + 1)) + ' '; 的Ascii码 ~是126 空格为32 所以symbol=(rand()%('~'-''+1))+''相当于: symbol = rand(); 这将为您提供一个介于32和126之间的随机数 C99 7.20.2.1 rand函数计算 范围从0到RAND_MAX RAND_MAX宏的值应至少为32767 如果您想要一个介于0和最小

我知道每次我运行程序“symbol”都是不同的。但是,为什么我不能使用

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

  • ~
    是126

  • 空格
    为32

所以
symbol=(rand()%('~'-''+1))+''相当于:

symbol = rand();
这将为您提供一个介于
32
126
之间的随机数


C99 7.20.2.1

rand
函数计算 范围从0到RAND_MAX

RAND_MAX宏的值应至少为32767

如果您想要一个介于0和最小值(最大值(32767,rand_max)之间的范围,可以使用
symbol=rand()

Ascii的

  • ~
    是126

  • 空格
    为32

所以
symbol=(rand()%('~'-''+1))+''相当于:

symbol = rand();
这将为您提供一个介于
32
126
之间的随机数


C99 7.20.2.1

rand
函数计算 范围从0到RAND_MAX

RAND_MAX宏的值应至少为32767

如果您想要一个介于0和最小值(最大值(32767,rand_max)之间的范围,可以使用
symbol=rand()

没有所谓的字符算术注释(AFAIK),这意味着它是正常的业务。你似乎对整个表情感到困惑

按照

  • ~
    的十进制值为126
  • 的十进制值为32
rand()
的输出将在空间上按范围进行模值,以便生成一个值

要分解它

  • ('~'-''+1)
    =
    126-32+1
    =
    95
  • (rand()%('~'-''+1))
    生成一个介于
    0-94之间的随机数
  • (rand()%('~'-''+1))+'
    产生一个介于
    32-126之间的随机数,这是可打印的范围
为什么我不能使用
symbol=rand()

好吧,那句话没有错,但是看起来它的目的是生成一个可打印的
符号


注:

引用第§6.4.4.4章中的
C11

整数字符常量是一个包含一个或多个多字节字符的序列 在单引号中,如在“x”中。[……]

以及

整型字符常量的类型为
int
。[……]

所以,一直以来都是整数运算。

没有所谓的字符算术注释(AFAIK),这意味着它是正常的业务。你似乎对整个表情感到困惑

按照

  • ~
    的十进制值为126
  • 的十进制值为32
rand()
的输出将在空间上按范围进行模值,以便生成一个值

要分解它

  • ('~'-''+1)
    =
    126-32+1
    =
    95
  • (rand()%('~'-''+1))
    生成一个介于
    0-94之间的随机数
  • (rand()%('~'-''+1))+'
    产生一个介于
    32-126之间的随机数,这是可打印的范围
为什么我不能使用
symbol=rand()

好吧,那句话没有错,但是看起来它的目的是生成一个可打印的
符号


注:

引用第§6.4.4.4章中的
C11

整数字符常量是一个包含一个或多个多字节字符的序列 在单引号中,如在“x”中。[……]

以及

整型字符常量的类型为
int
。[……]


所以,它一直都是整数运算。

C中的字符常量都是整数。因此,以下是:

symbol = (rand() % (126 - 32 + 1)) + 32;
计算
'~'
的编码与
'
的编码之间的偏移量,并向其中添加一个偏移量。这是它们之间有多少不同的字符编码,让我们调用这个数字
m

('~' - ' ' + 1)
获取一个伪随机数并将其映射到范围
[0,m)
,让我们调用该数字
n

(rand() % ('~' - ' ' + 1))
这只需将
n
视为偏移量,并将其添加到
'
的编码中,从而获得符号的编码。符号将始终是某个集合中的一个



上述操作将把一个可能远远超出字符范围的整数转换为字符值。这将以某种实现定义的方式完成。至少可以说,这不是获得正确结果的最可靠方法。

C中的字符常量是整数。因此,以下内容:

symbol = (rand() % (126 - 32 + 1)) + 32;
计算
'~'
的编码与
'
的编码之间的偏移量,并向其中添加一个。这是它们之间有多少不同的字符编码,让我们调用该数字
m

('~' - ' ' + 1)
获取一个伪随机数并将其映射到范围
[0,m)
,让我们调用该数字
n

(rand() % ('~' - ' ' + 1))
这只需将
n
视为偏移量,并将其添加到
'
的编码中,从而获得符号的编码。符号将始终是某个集合中的一个


上面将把一个可能远远超出字符范围的整数转换成一个字符值。这将以实现定义的方式完成。这不是mos