【问题标题】:const char * comparation with ==const char * 与 == 比较
【发布时间】:2011-07-29 13:13:33
【问题描述】:

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

const char * LOL = "LOL";  

const char * getI() {  
    return LOL;  
}

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

【问题讨论】:

  • 可能的重复是关于你应该如何比较字符串内容。这个问题可能与此无关。
  • 每次看到LOL 我都会笑出声来。我一定是个书呆子。

标签: c arrays char constants design-patterns


【解决方案1】:

这是一个好习惯吗?

嗯,这取决于。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 内容相同,因为它们是相同的全局常量变量。同意吗?
    • 在这种特殊情况下,是的,它们是相同的。需要考虑的是您是否也希望if(getl() == "FOO") 比较为true,或者如果您希望if(getl() == getx()) 返回true,如果getx() 还返回一个指向“LOL”字符串的任意指针。
    【解决方案3】:

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

    当您说“我期望的价值”时,您是什么意思?你希望做什么

    不知道你的答案:一般来说,不好的做法。据我所知,编译器可以巧妙地重用字符串的位置。所以这种行为:

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

    定义不明确。

    【讨论】:

      【解决方案4】:

      嗯,...您正试图返回一个具有全局名称的值,以便代码更具可读性,对吧? (如果我误解了,请忽略:P)。推理很好,但这不是要走的路。

      通常的做法是#define:

      #define MY_MEANINGFUL_RETURN 1
      
      int doSomething() {
          return MY_MEANINGFUL_RETURN;
      }
      
      (...)
          if (doSomething() == MY_MEANINGFUL_RETURN)
      (...)
      

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

      【讨论】:

      • 我必须使用 char *,所以我选择在 #define "string" 之前执行 "const char *",因为它会在我引用它和 const char * 的每个地方创建一个自动变量为我节省空间。
      • 如果你必须使用 char*,我回答错了问题 :)
      【解决方案5】:

      对象身份与平等:

      如果您打算使用它作为“识别”对象的一种方式/构造(在这种情况下,全局指针 LOL 实际上只是您的代码行中的 SAME 对象),那么它是安全的。

      但深入研究您的示例,您似乎真正想做的是检查“相等”:即测试两个对象是否相等,即它们是否包含相同的值?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-27
        • 2012-05-03
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多