好吧,今天我做了一个小功能,它应该会产生一些随机字符串。
std::string randString(size_t length)
{
std::string randStr;
for(unsigned int i = 0; i < length; i++)
randStr.append(1, (char) rand() % 26 + 65);
return randStr;
}
我希望只获得大写字母,但实际上我也得到了其他字母,如'3'或')'。所以我假设存在某种操作数错误的顺序。使用模数周围的括号我得到预期的结果!我额外搜索了模数和加法的运算顺序,它说modulo具有更高的优先级! 谁能解释一下我为什么要用这个模数括号?
我使用gcc 4.1.2
答案 0 :(得分:4)
operator %
的优先级高于oeprator+
,但铸造的优先级更高。
所以,你有 undefined 实现(感谢@JamesKanze)定义的行为,因为signed char
溢出。
你不需要用括号括起“modulo”运算符,但是你需要转换为最终结果:(char)( rand() % 26 + 65 )
答案 1 :(得分:2)
是的,类型转换的优先级高于%
和+
(但低于函数调用),因此此处的顺序为:
rand()
((char) rand())
((char) rand()) % 26
(((char) rand()) % 26) + 65
如果不确定运算符优先级,请始终添加括号!它们不会受到伤害,但有助于避免此类错误。要获得您想要的结果,您应该添加括号以使类型转换成为最后一个:
(char) (rand() % 26 + 65);
以下是参考表:http://en.cppreference.com/w/cpp/language/operator_precedence