我有一个函数将const char *返回到一个固定值,当我使用这个函数时,我会使用“==”运算符来查找返回值和我期望的值之间的平等性。这是一个好习惯吗?它应该是反模式吗? 例如:
const char * LOL = "LOL";
const char * getI() {
return LOL;
}
main {
if (getI() == LOL)
something();
}
答案 0 :(得分:6)
这是一个好习惯吗?
嗯,这取决于。
当且仅当您想要测试getl()
返回的指针是否指向与全局LOL
指针相同的字符串文字时,这是正确的做法。如果这不是你想要做的,那么,不,这不是一个好的做法。
答案 1 :(得分:3)
这取决于。如果您试图检测字符串的实例是否相同,那么这是正确的做法。如果您试图检测字符串的内容是否相同,则不是。
答案 2 :(得分:2)
正如其他人所说,这取决于你想做什么。
当你说“我期望的价值”时,你的意思是什么?您期望做什么?
不知道你的答案:一般来说,不好的做法。据我所知,编译器可以巧妙地重用字符串的位置。所以这个行为:
const char *LOL = "lol";
const char *test = "lol";
return (test == LOL);
没有明确定义。
答案 3 :(得分:1)
嗯,...你正在尝试使用全局名称返回一个值,以便代码更具可读性,对吧? (如果我误解了,请忽略:P)。理由很棒,但这不是可行的方法。
通常的做法是#define
:
#define MY_MEANINGFUL_RETURN 1
int doSomething() {
return MY_MEANINGFUL_RETURN;
}
(...)
if (doSomething() == MY_MEANINGFUL_RETURN)
(...)
如果使用上面的const char * techique,则必须在执行期间将这些字符串存储在内存中,然后仅比较它们的内存位置。使用第二种方法,编译器可以管理数字,并且您可以获得漂亮的名称而无需任何额外的时间或空间。
答案 4 :(得分:1)
对象身份与平等:
如果您打算将它用作“识别”对象的方式/构造(在这种情况下是全局指针LOL,它实际上只是代码行中的SAME对象),那么它是安全的。
但是深入研究一下你的例子,看起来你真正想做的就是检查“平等”:即测试两个对象是否相等,即它们是否包含相同的值?