【问题标题】:C void pointer with ternary operator带有三元运算符的 C void 指针
【发布时间】:2018-08-25 14:36:43
【问题描述】:

我在使用三元条件运算符时遇到了一个问题。

如果发生:

int x = 5;
void * pointer = &x;
printf("x: %d \n", 1 == 1 ? (*((int*)pointer)) : (*((char*)pointer)));

它向控制台写入数字 5,这是正确的活动。但是当我将最后一行 char 更改为 double 时:

printf("x: %d \n", 1 == 1 ? (*((int*)pointer)) : (*((double*)pointer)));

然后它写0,我不知道为什么。我知道我可以使用 if-else 来代替它,但我只是好奇它为什么会这样工作。谁能帮帮我?

【问题讨论】:

  • 尝试确定整个三元表达式的类型(它只有一种类型)
  • 如果您启用(或阅读)警告,您的编译器可以帮助您。
  • 这与您在三元中使用指针这一事实无关,因此您的问题标题完全是误导。 1 ? 5 : 5.0 会出现同样的问题。

标签: c ternary-operator void-pointers


【解决方案1】:

三元表达式的结果是两个分支的公共类型。如果一个分支是 int 而另一个分支是 double,那么结果也将是 double

而且您没有打印double 值,而是尝试打印int 值。格式说明符和值不匹配会导致undefined behavior

有关更多信息,请参阅例如this conditional operator reference.

【讨论】:

    【解决方案2】:

    您应该使用%lf 而不是%d

    int x = 5;
    void * pointer = &x;
    printf("x: %lf \n", 1 == 1 ? (*((int*)pointer)) : (*((char*)pointer)));
    

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2011-04-01
      • 2023-02-03
      相关资源
      最近更新 更多