开发者

C++: Pointer assignment warning on strchr()

I get the error assignment makes pointer fro开发者_Go百科m integer without a cast on the following code, what does it mean?

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


It is because of the priority of operations. You need to put an extra set of parens to make sure it happens in the right order:

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

otherwise the it will evaluate as this:

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

Since strchr(key, ':') != NULL will evaluate to either a 1 or a 0, in your example, you are assigning an integer to a pointer type, hence the warning.

however, i would just write it as in your second example, since it is simpler and less error prone. Making it one line shorter doesn't add anything except complexity.


The not-equal operator != has higher precedence than the assignment operator =, so your original line reads like splitter = (strchr(key, ':') != NULL) rather than your intended (splitter = strchr(key, ':)) != NULL, so the compiler tries to assign to splitter the result of the comparison between strchr() and NULL.


The != operator has a higher precedence than the = operator. That means your expression splitter = strchr(key, ':') != NULL is actually interpreted as splitter = (strchr(key, ':') != NULL).

Put the assignment into parentheses to increase the precedence of that part:

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


The != has higher precendence than the =. You should fully parenthesize:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜