【问题标题】:C++: Pointer assignment warning on strchr()C++:strchr() 上的指针分配警告
【发布时间】:2010-09-05 17:19:16
【问题描述】:

我在以下代码中收到错误assignment makes pointer from integer without a cast,这是什么意思?

char * splitter;
if(splitter = strchr(key, ':') != NULL && *(splitter + 1) == ' ')

【问题讨论】:

标签: c++ pointers compiler-warnings


【解决方案1】:

这是因为操作的优先级。您需要添加一组额外的括号以确保它以正确的顺序发生:

char * splitter;
if((splitter = strchr(key, ':')) != NULL && *(splitter + 1) == ' ')

否则它将评估为:

splitter = (strchr(key, ':') != NULL)

由于strchr(key, ':') != NULL 将评估为10,因此在您的示例中,您将整数分配给指针类型,因此会出现警告。

但是,我会像您的第二个示例那样编写它,因为它更简单且不易出错。缩短一行不会增加任何东西,除了复杂性。

【讨论】:

  • 我也会写 splitter[1] 而不是 *(splitter + 1)
【解决方案2】:

不等于运算符 != 比赋值运算符 = 具有更高的优先级,因此您的原始行看起来像 splitter = (strchr(key, ':') != NULL) 而不是您想要的 (splitter = strchr(key, ':)) != NULL,因此编译器尝试分配以拆分之间的比较结果strchr() 和 NULL。

【讨论】:

    【解决方案3】:

    != 运算符的优先级高于 = 运算符。这意味着您的表达式 splitter = strchr(key, ':') != NULL 实际上被解释为 splitter = (strchr(key, ':') != NULL)

    将赋值放在括号中以增加该部分的优先级:

    (splitter = strchr(key, ':')) != NULL
    

    【讨论】:

      【解决方案4】:

      != 的优先级高于 =。你应该用括号括起来:

      if (((splitter = strchr(key, ':')) != NULL) && (*(splitter + 1) == ' '))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-03
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 2014-10-10
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多