为何rand() & 100 + 1未触发编译错误?运算符误写技术咨询
关于rand()误用&代替%的问题解析
咱们一步步拆解你遇到的问题:
1. 为什么编译器没有报错?
C++里的&有两种用法:单目取地址运算符和双目按位与运算符。在你的代码里rand() & 100 + 1,rand()返回一个整数,100+1也是整数,这里的&是作为双目按位与运算符来使用的——两个整数之间做按位与操作是完全合法的语法,编译器只会检查语法是否合规,不会替你判断逻辑是否符合预期,所以自然不会触发错误提示。
2. 这里的&是不是返回地址?
完全不是。只有当&作为单目运算符(比如&randomNumber)时,它才是取地址操作,返回变量的内存地址。而你代码里的&是双目运算符,作用是把rand()的结果和100+1的结果(也就是101)转换成二进制后,对应位进行与运算:只有当两个数的某一位都是1时,结果的该位才是1,否则是0。
3. 这个笔误为啥难排查?
有几个关键原因:
- 键盘位置接近:
%和&在标准键盘上相邻(比如美式键盘上,%在数字5上,&在数字7上),输入时很容易误触; - 语法合法无提示:编译器认为这是合法代码,不会给出警告或错误,你没法靠编译器帮你发现问题;
- 结果有迷惑性:按位与101的结果看起来也是随机数,但它的取值范围和你想要的1-100完全不同——101的二进制是
0b1100101,所以结果只能是这个二进制位上为1的组合(比如1、4、5、32、33等),不会覆盖1-100的所有数,但如果只是偶尔测试,可能不会立刻发现范围异常。
错误与正确代码对比
错误代码
unsigned int randomNumber = rand() & 100 + 1;
(注:这里还要注意运算符优先级,+的优先级比&高,所以实际计算的是rand() & (100+1),也就是rand() & 101,这和你原本想的(rand()%100)+1逻辑完全不同)
正确代码
unsigned int randomNumber = rand() % 100 + 1;
完整测试代码(带笔误)
#include <iostream> #include <cstdlib> #include <ctime> int main() { srand(static_cast<unsigned int>(time(nullptr))); unsigned int randomNumber; char again; do { std::cout << "Do you want to generate a random number? (y/n) "; std::cin >> again; randomNumber = rand() & 100 + 1; std::cout << randomNumber << '\n'; } while (again == 'y'); getchar(); return 0; }
内容的提问来源于stack exchange,提问作者Hawkbirdtree
相关产品推荐
相关产品推荐

