GCC编译出现意外警告?C代码问题排查与原因分析
问题分析:条件语句中的运算符优先级错误导致编译警告
我在个人项目的静态辅助函数里写了这段C代码:
char *tmp = NULL; if ((tmp = strchr(mode, 'b') != NULL) && tmp - mode < 3) return BINARY_MODE; else // ...
用GCC 12(Ubuntu 12.2.0-3ubuntu1)编译时收到警告:
warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
31 | if ((tmp = strchr(mode, 'b') != NULL) && tmp - mode < 3) return BINARY_MODE;
| ^
我通过括号限定strchr返回值的赋值顺序后消除了警告,程序运行符合预期,修正后的代码如下:
char *tmp = NULL; if ((tmp = strchr(mode, 'b')) != NULL && tmp - mode < 3) return BINARY_MODE; else // ...
问题原因
这不是GCC的bug,是代码犯了运算符优先级错误。C语言中,!=的优先级高于=,所以原代码里的表达式会被编译器优先解析成:
tmp = (strchr(mode, 'b') != NULL)
strchr(...) != NULL的结果是int类型的布尔值(0或1),把这个整数赋值给char*类型的tmp,就会触发“将int转为指针未做强制类型转换”的编译警告。
修正后的代码用括号明确限定了tmp = strchr(...)的执行顺序,先完成指针赋值,再判断指针是否非空,完全符合原本的逻辑需求。
内容的提问来源于stack exchange,提问作者Axel PASCON
相关产品推荐
相关产品推荐

