3

好吧,我今天做了一个小函数,它应该会生成一个小随机字符串。

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”或“)”。所以我假设存在某种操作数错误的顺序。在模数周围加上括号,我得到了预期的结果!我额外搜索了模数和加法的运算顺序,它说模数具有更高的优先级!谁能解释一下为什么我必须用括号括起来这个模数?

我使用 gcc 4.1.2

4

2 回答 2

4

operator %具有比 更高的优先级oeprator+,但 cast 具有更高的优先级。

所以,你在这里有未定义的实现(感谢@JamesKanze)定义的行为,因为signed char.

您不需要用括号括住“模”运算符,而是使用强制转换,因为您想要转换最终结果:(char)( rand() % 26 + 65 )

于 2013-09-17T07:56:55.057 回答
2

是的,类型转换的优先级高于%and +(但低于函数调用),所以这里的顺序是:

rand()
((char) rand())
((char) rand()) % 26
(((char) rand()) % 26) + 65

当不确定运算符优先级时,请始终添加括号!它们不会造成伤害,但有助于避免此类错误。要获得您想要的结果,您应该添加括号以使类型转换最后进行:

(char) (rand() % 26 + 65);

这是一个参考表:http ://en.cppreference.com/w/cpp/language/operator_precedence

于 2013-09-17T07:53:54.407 回答