带有三元运算符的 C void 指针

C void pointer with ternary operator

我在使用三元条件运算符时遇到空指针问题。

如果是:

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

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

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

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

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

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

有关详细信息,请参见例如this conditional operator reference.

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

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