为何判断两整数同符号的samesign函数可运行?求解析
你的
samesign函数“正常工作”其实是巧合! 哇,这个问题挺有意思的——乍一看a | 0好像完全是多余的操作,但居然在你的测试用例里得到了预期结果?咱们一步步拆解来看:
首先,a | 0到底做了什么?
在C语言中,对整数执行位或0的操作,完全不会改变变量的值。因为二进制里任何位和0做或运算,结果还是原来的位(0|0=0,1|0=1)。所以a | 0等价于直接写a,你的samesign函数本质上是在判断:
return a == b;
为什么你的测试用例里它看起来“正常”?
看你给出的测试用例:
- 符号相同的情况:都是两个完全相等的数(
a和a、b和b、c和c),这时候a==b为真,输出“same sign”,刚好符合预期; - 符号不同的情况:都是值不相等的数(正和负、正和0、负和0),这时候
a==b为假,输出“not same sign”,也刚好符合预期。
说白了,你的测试用例刚好没有覆盖到“符号相同但值不同”的场景——比如你试试调用checksign(5, 10),你的函数会输出“5 and 10 have not the same sign.”,这显然是错误的,因为它们都是正数,符号完全相同。
正确的符号判断方法
如果你想真正判断两个整数的符号是否相同,可以用这些更可靠的写法:
方法1:利用异或的符号位
两个有符号整数符号相同时,它们的异或结果最高位(符号位)为0(正数);符号不同时,异或结果最高位为1(负数)。所以可以写:
bool samesign(int a, int b) { return (a ^ b) >= 0; }
(注:这个方法会把0和正数/负数都视为符号不同,如果你想把0和0视为同符号,这个逻辑也成立,因为0^0=0 >=0为真)
方法2:直白的逻辑判断
如果觉得位运算不够直观,也可以用清晰的条件判断:
bool samesign(int a, int b) { // 同正、同负,或者都是0 return (a > 0 && b > 0) || (a < 0 && b < 0) || (a == 0 && b == 0); }
总结
你的samesign函数能通过当前测试纯属于巧合,它本质是在比较两个数是否相等,而非判断符号是否相同。一旦遇到符号相同但值不同的输入,就会立刻出错。替换成上面的正确逻辑,才能真正实现“判断符号相同”的功能。
内容的提问来源于stack exchange,提问作者rolika
相关产品推荐
相关产品推荐

