返回信息流rt。今天写了个小程序,之间有个判断条件是97<=*p<=122(就是判断是小写字母,如果是的话就转化成大写,*p是一个字母)。
但是这个条件是恒成立的。
我知道正确的应该是97<=*p&&*p<=122。
只是好奇程序运行时是怎么处理97<=*p<=122的?
这是一条镜像帖。来源:北邮人论坛 / cpp / #75969同步于 2013/12/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
编译器是怎么处理连续不等判断条件的
Emileee
2013/12/9镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
嗯,这个我想到了是先处理左边。
只不过想的还有点不对。
我以为,编译器处理97<=*p后返回了一个1,然后再相当于进行1<=122比较。
但是我把122改为0之后判断的结果也是true,就想不明白为什么了(就是97<=*p<=0这个条件编译器最终判断还是为真)。
【 在 iam19891211 的大作中提到: 】
: 这也是运算符优先级的问题,二者优先级相同,所以从左向右
: 先得到97<=*p,
: 然后再向后运算。
你的*p内容是大写字母?
【 在 Emileee 的大作中提到: 】
: 嗯,这个我想到了是先处理左边。
: 只不过想的还有点不对。
: 我以为,编译器处理97<=*p后返回了一个1,然后再相当于进行1<=122比较。
: ...................
【 在 Emileee 的大作中提到: 】
: 嗯,这个我想到了是先处理左边。
: 只不过想的还有点不对。
: 我以为,编译器处理97<=*p后返回了一个1,然后再相当于进行1<=122比较。
: ...................
lz调试下,int a=(97<=*p)的返回值 ,然后向右取运算符比较。
是c++ primer 9.34练习题,题目就是把string中的字符都改为大写。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string st("Hello World!");
for(string::iterator it=st.begin();it!=st.end();it++){
cout<<*it<<' ';//debug时加的
if(97<=*it<=122)//后来122换成0 if条件也始终成立
*it-=32;
}
cout<<st<<endl;
return 0;
}
【 在 tangzehang 的大作中提到: 】
: 能贴下你的源码么?厄,我测试的结果是没问题的。
int a=(97<=*p)的返回值是正确的,小写字母返回1,大写字母返回0
不过非常抱歉,不太明白你说的“向右取运算符比较”具体用代码字母操作。
是然后 a<=0 这样子判断么?
【 在 MichaelJohn 的大作中提到: 】
: lz调试下,int a=(97<=*p)的返回值 ,然后向右取运算符比较。