C ++:strchr()上的指针赋值警告

时间:2010-09-05 17:19:17

标签: c++ pointers compiler-warnings

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

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

4 个答案:

答案 0 :(得分:3)

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

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

否则它将评估为:

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

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

然而,我会像你的第二个例子那样写它,因为它更简单,更不容易出错。缩短一行不会增加任何东西,除了复杂性。

答案 1 :(得分:2)

不等于运算符!=的优先级高于赋值运算符=,因此原始行的读取方式与splitter = (strchr(key, ':') != NULL)相似,而不是预期的(splitter = strchr(key, ':)) != NULL,因此编译器会尝试将分配结果分配给拆分器strchr()和NULL之间的比较。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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