C:这是类型铸造的正确案例吗?

C:这是类型铸造的正确案例吗?,c,C,当我编译以下代码(使用-Wall)时,没有收到任何警告,因为我将*(str)+转换为void类型。但是,如果我不将该操作强制转换为void类型,则会出现以下警告:警告:未使用计算值[-Wunused value]这是消除编译器警告的正确方法吗 #include <stdio.h> static void print(char *str) { while(*str) { printf("%c\n", *str); (void)*(str)++; } } i

当我编译以下代码(使用-Wall)时,没有收到任何警告,因为我将
*(str)+
转换为void类型。但是,如果我不将该操作强制转换为
void
类型,则会出现以下警告:
警告:未使用计算值[-Wunused value]
这是消除编译器警告的正确方法吗

#include <stdio.h>

static void print(char *str)
{
  while(*str) {
    printf("%c\n", *str); 
    (void)*(str)++;
  }
}

int main(void)
{
  print("Hello");
  return 0;
}
#包括
静态无效打印(字符*str)
{
while(*str){
printf(“%c\n”,*str);
(无效)*(str)+;
}
}
内部主(空)
{
打印(“你好”);
返回0;
}

消除这些编译器警告的正确方法是简单地执行
str++

这是正确的,但是您没有必要取消引用--您不需要
*(str++)
,只需要
str++
。除此之外,你可能只是想

for(; *str; str++) { 
    printf("%c\n", *str);
}
相反


另请参见。

当递增指针时,您不需要使用
*
。您可以递增指针,取消对其旧值的引用,并且对结果不做任何处理。警告就是这么说的
(void)
是将某事物标记为“已使用”的正确方法,即使它不起任何作用。但这里不需要它(事实上,它很少需要,通常在宏中)-因为不需要不使用的值,所以不需要首先取消引用指针。
str++
仍然有一个返回值,这不应该修复它。执行此操作时,我不会收到警告。@RPM:您不会,这是有效的C.@quantdev我对gcc的工作原理有错误,因此它似乎确实停止了警告,但没有理由它应该--
*(str++)
str++
都返回一个值——前者返回一个
char
,后者返回一个
char*
@使用
for
循环比使用随机挂起的
str++
可以更清楚地解决RPM的问题。for循环中的str++也会做同样的事情。任何现代编译器都会为两个循环生成严格相同的机器代码:它们是相同的!无需读取具有副作用的运算符的返回值。编辑:但我很感激讨论这个问题,这是积极的!是的,C没有字符串,只有
char*
s。字符串文字将是堆栈分配的
char*
f(“某些字符串”)
char[]tmp=“某些字符串”相同;f(tmp)
。通常在堆栈上找不到字符串文本
char[]tmp=“一些字符串”tmp
是一个局部变量,则code>可能在堆栈上,但这是
tmp
的位置,而不是字符串literal
“some string”
的位置,如果它在内存中显式表示,可能在靠近代码的某个只读段中。@PascalCuoq我的错误,感谢您纠正我的错误。根据我的研究,
char*str=“hello”
是一种分配为静态只读内存的内存。