C пустой указатель с троичным оператором - PullRequest
0 голосов
/ 25 августа 2018

У меня проблема с пустым указателем, используемым с оператором троичного условия.

В случае:

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

Записывает в консоль номер 5, что является правильной активностью. Но когда я изменяю в последней строке символ на удвоение:

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

Потом пишет 0, и я не знаю почему. Я знаю, что могу использовать if-else вместо этого, но мне просто любопытно, почему это так работает. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы должны использовать %lf вместо %d

int x = 5;
void * pointer = &x;
printf("x: %lf \n", 1 == 1 ? (*((int*)pointer)) : (*((char*)pointer)));
0 голосов
/ 25 августа 2018

Результатом троичного выражения является общий тип двух ветвей.В случае если одна ветвь имеет значение int, а другая - double, то результатом будет также double.

И вы не печатаете значение double, вы пытаетесьнапечатать значение int.Несоответствие спецификатора и значения формата приведет к неопределенному поведению .

Для получения дополнительной информации см., Например, эту ссылку на условный оператор .

...