const char *与==比较

时间:2011-04-04 22:57:06

标签: c arrays char const design-patterns

我有一个函数将const char *返回到一个固定值,当我使用这个函数时,我会使用“==”运算符来查找返回值和我期望的值之间的平等性。这是一个好习惯吗?它应该是反模式吗? 例如:

const char * LOL = "LOL";  

const char * getI() {  
    return LOL;  
}

main {  
    if (getI() == LOL)  
        something();  
}  

5 个答案:

答案 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对象),那么它是安全的。

但是深入研究一下你的例子,看起来你真正想做的就是检查“平等”:即测试两个对象是否相等,即它们是否包含相同的值?