const char *与==比较

问题描述 投票:1回答:5

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

const char * LOL = "LOL";  

const char * getI() {  
    return LOL;  
}

main {  
    if (getI() == LOL)  
        something();  
}  
c arrays char const design-patterns
5个回答
6
投票

这是一个好习惯吗?

嗯,这取决于。

当且仅当您想要测试getl()返回的指针是否指向与全局LOL指针相同的字符串文字时,这是正确的做法。如果那不是你想要做的,那么,不,这不是好的做法。


3
投票

那要看。如果您试图检测字符串的实例是否相同,那么这是正确的做法。如果您试图检测字符串的内容是否相同,那么它不是。


2
投票

正如其他人所说,这取决于你想做什么。

当你说“我期望的价值”时,你的意思是什么?你能指望什么?

不知道你对此的回答:总的来说,糟糕的做法。据我所知,编译器可以巧妙地重用字符串的位置。所以这个行为:

const char *LOL = "lol";
const char *test = "lol";
return (test == LOL);

没有明确的定义。


1
投票

好吧,...你正在尝试使用全局名称返回一个值,以便代码更具可读性,对吧? (如果我误解了,请忽略:P)。理由很棒,但这不是可行的方法。

通常的做法是#define

#define MY_MEANINGFUL_RETURN 1

int doSomething() {
    return MY_MEANINGFUL_RETURN;
}

(...)
    if (doSomething() == MY_MEANINGFUL_RETURN)
(...)

如果您使用上面的const char * techique,则必须在执行期间将这些字符串存储在内存中,然后仅比较它们的内存位置。使用第二种方法,编译器管理数字,您可以获得漂亮的名称,而无需任何额外的时间或空间。


1
投票

对象身份与平等:

如果您打算将它用作“识别”对象的方式/构造(在本例中是全局指针LOL,它实际上只是代码行中的SAME对象),那么它是安全的。

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

© www.soinside.com 2019 - 2024. All rights reserved.