Qt中QByteArray::indexOf始终返回1的问题排查求助
Qt中QByteArray.indexOf返回值异常的排查
问题代码
QByteArray bItem; QByteArray alpha("0123456789ABCDEF"); quint8 iItemHi=0, iItemLo=0, index; QTableWidgetItem *hexItem = new QTableWidgetItem; hexItem = ui->hexSectorDisplay->item(x,y); bItem = hexItem->data(Qt::EditRole).toByteArray(); if(bItem.size() == 1) { if(index=alpha.indexOf(bItem.at(0), 0) != -1) { iItemLo = index; } else { iItemLo=0; } }
问题描述
上述代码用于从QTableWidget(hexSectorDisplay)单元格读取十六进制字符(1或2个字符),转换为QByteArray后,在alpha中查找字符对应的索引值作为十六进制数值。但无论查找什么字符,alpha.indexOf(bItem.at(0), 0)的返回值始终被识别为1,不符合预期。使用环境为Qt 5.15.2 + MSVC2019。
问题原因
这是运算符优先级导致的错误:!=的优先级高于=,所以代码中的条件表达式会先执行alpha.indexOf(bItem.at(0), 0) != -1,将这个布尔判断的结果(true或false)赋值给index。由于布尔值true在转换为整数时等于1,false等于0,而你每次查找的字符都存在于alpha中,所以判断结果为true,index被赋值为1,而非indexOf的实际返回值。
修正方案
给赋值表达式加上括号,改变运算顺序,先执行赋值再判断:
if( (index = alpha.indexOf(bItem.at(0), 0)) != -1 ) { iItemLo = index; } else { iItemLo = 0; }
这样index会先被赋值为indexOf的实际返回值,再判断该值是否不等于-1,就能得到正确的索引结果。
内容的提问来源于stack exchange,提问作者atari8warez
相关产品推荐
相关产品推荐

