В приведенной ниже простой тестовой программе c два оператора printf возвращают разные значения. (проверьте последние четыре оператора printf).
int main ()
{
char c, *cc;
int i;
long l;
float f;
c = 'Z';
i = 15;
l = 7777;
f = 9999999312;
cc = &c;
printf("\nc = %c, cc= %u", *cc, cc);
cc = &i;
printf("\nc = %d, cc= %u", *cc, cc);
cc = &l;
printf("\nc = %ld, cc= %u", *( long* )cc, cc);
printf("\nc = %ld, cc= %u", *cc, cc);
cc = &f;
printf("\nc = %f, cc= %u", *(float *)cc, cc);
printf("\n cc= %u", cc);
printf("\nc = %f, cc= %u", *cc, cc);
printf("\nc = %f, cc= %u", *(float *)cc, cc);
printf("\nc = %f, cc using pointer = %p", *(float *)cc, cc);
printf("\nc = %f, cc using pointer =%p", *cc, cc);
return 0;
}
выход : -
c = Z, cc= 755585903
c = 15, cc= 755585904
c = 7777, cc= 755585912
c = 97, cc= 755585912
c = 9999998976.000000, cc= 755585908
cc= 755585908
c = 9999998976.000000, cc= 4294967288
c = 9999998976.000000, cc= 755585908
c = 9999998976.000000, cc using pointer = 0x7ffc37f4ace4
c = 9999998976.000000, cc using pointer =0xfffffff8
Я запускаю его в eclipse ide и использую Ubuntu Linux.
Почему оно ведет себя иначе?
C
нельзя узнать экспериментальным путем. - person Eugene Sh.   schedule 12.03.2018cc
не изменяется во время последних двух операторовprintf
, а напечатанное значение отличается (4294967288 против 755585908). - person s7amuser   schedule 12.03.2018printf()
вы передаетеchar
(который преобразуется вint
), а затем говоритеprintf()
отформатировать его какdouble
. У этого так много возможностей запутать вас, компилятор и библиотеку — это неопределенное поведение; вам повезло, что компилятор не решил переформатировать ваш жесткий диск (это неопределенное поведение — к счастью для вас, компиляторы делают это нечасто). Нет смысла спекулировать на деталях. То, что вы показываете, загружено неопределенным поведением. Все является приемлемым результатом. - person Jonathan Leffler   schedule 12.03.2018f = 9999999312;
этот оператор присваиваетint
float
. Предложите избежать неявного преобразования и записать оператор как:f = 9999999312.0f;
- person user3629249   schedule 13.03.2018cc = &i;
выполняется несоответствующее присвоение из 'address ofint' being assigned to a 'pointer to char' Such oversights result in an implicit conversion. When using
gcc, with the option
-Wconversion' компилятор сообщит вам об этой проблеме - person user3629249   schedule 13.03.2018printf("\nc = %ld, cc= %u", *cc, cc);
переменнаяcc
является указателем на char. так что это НЕunsigned int
. правильный спецификатор формата -%p
, поэтому исправленное выражение будет таким: `printf(\nc = %ld, cc= %p, *cc, cc); - person user3629249   schedule 13.03.2018