modulo - gcc错误的操作数顺序?还是UB?

时间:2013-09-17 07:50:14

标签: c++ gcc modulo

好吧,今天我做了一个小功能,它应该会产生一些随机字符串。

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

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