【问题标题】:char* and boolean TRUE FALSE in CC 中的 char* 和布尔值 TRUE FALSE
【发布时间】:2013-10-17 19:52:58
【问题描述】:

我有一段遗留代码有 char* 用于 if-then-else 逻辑流的函数参数。例如:

void myFunc(char *f_reset) {

     .....
     .....
     if(*f_reset) {// do this;}
     else {// do that;}

}

假设我从main() 拨打myFunc(char *f_reset)

 void main(void) {
     char r = 0;
     char *f_reset = &r;

     *f_reset = 0;

     myFunc(f_reset);  // Debug and enter this function

  }

当我尝试进入函数调用时,我发现 *f_reset 从未被评估为 0 即 false - 由于一些垃圾 -8342345825 或类似的东西,它始终为 true。

它使用char* 的原因可能是因为在过去,布尔值比字符 * 占用更多的内存?我过去在 Stackoverflow 帖子中读到的一些内容。

有人能给我一个关于char*和逻辑真假之间关系的虚拟指南吗?

【问题讨论】:

  • 零字面量 '0' 不计算为零/假?
  • 试试'\0',或者干脆0
  • @Shaggi 不,它没有。我用过'H','L','h','l',但什么也没用。如果您使用基于char * 的 if-then-else 编写一个快速的小程序并对其进行调试,它将向您显示 ascii 编号,而不是您想要的。是不是很沮丧?
  • @WhozCraig 我确定 0 不起作用。我很确定。
  • 好吧,那你就错了,而且很确定。 char ar[2], *p = ar; *p = 0; if (*p){} else{}执行 if 块。 *p 等于错误。除了全零八位字节之外的任何内容都等于真。也许发布一个编译并演示您的问题的真实示例可能会有所帮助?

标签: c char boolean char-pointer


【解决方案1】:

C 中没有布尔类型。 if statment evaluete 只有整数,所以整数值 0 是假的,其他都是真的。 char 类型可以作为 8 位整数使用。

字符值:

char var = '0';

对应于整数值48(参见ASCII table)而不是整数值0。

在您的示例中,您有一个 char 指针。但是在您的 if 语句中,您不是在评估指针,而是在评估它的值;因此,*f_reset 必须为 0(整数)才能被评估为假。

char var = 0;

...
myFunc(&var);
...

【讨论】:

    【解决方案2】:
    #include<stdio.h> 
    #define TRUE 1
    #define FALSE 0
    void myFunc(char *);
    int main()
    {
    char r = FALSE;
    char *f_reset = &r;
    
    
    
    myFunc(f_reset);  // Debug and enter this function
    
    }
    
    void myFunc(char *f_reset)
    
    {
    if(*f_reset)
    printf("true");
    else
    printf("false");
    
    }
    

    【讨论】:

    • @hugbear 如果您想使用布尔值作为字符指针,可以使用这段代码为简单起见。分配 r=TRUE 计算结果为 true,反之亦然
    【解决方案3】:
    #include<stdio.h>
    int main()
    {
    char *x;
    char a=0;
    x=&a;
    
    if(*x)
    printf("true");
    else
    printf("false");
    
    return 0;
    }
    

    【讨论】:

    • 试试这段代码,你会得到错误的输出。但是,分配 a='0' 将使输出为 true,因为它将被转换为其 ascii 值。
    • @Sarwan 我知道,但是如果您随后将 *x 传递给函数,它仍然评估为 TRUE,我希望它为 false。
    • @hagubear 将 *x 传递给它仍然评估为 TRUE mean 的函数是什么?正如我之前所说,您发布的代码甚至没有编译,甚至不是有效的C。如果您在您的问题中发布了一个正常运行但失败的示例,通常称为SSCCE,连同您想要发生但不与代码内联的事情(理想情况下在 cmets 中),了解您的目标以及为什么不这样做会更加容易到达它。
    • @WhozCraig 代码 sn-p 现已更新。我的代码编译得很好。我想要的是一个解决方案,如何在 C 代码中使用 char* 正确使用逻辑真/假。
    • @hagubear 它看起来不错。 main 中的 f_reset 变量有点毫无意义,因为您可以通过 &amp;r 并完成它。 IE。 char r = 0; myFunc(&amp;r); 但正如写的那样,它应该做你想做的事,在这种情况下,if (*f_reset) 应该评估为 false,并且 else-block 应该命中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2015-09-06
    • 2015-10-15
    相关资源
    最近更新 更多