учитывая следующий фрагмент кода с неправильным оператором printf для аргумента «a»:
#include <stdio.h>
void call(unsigned long long a, int b)
{
printf("%lu,%d\n",a,b);
printf("%llu,%d\n",a,b);
}
void main()
{
call(0,1);
}
Когда вы скомпилируете это нормально, вы получите:
$ gcc m32.c
m32.c: In function ‘call’:
m32.c:4:12: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘long long unsigned int’ [-Wformat=]
printf("%lu,%d\n",a,b);
^
$ ./a.out
0,1
0,1
но когда вы скомпилируете это с -m32, вы получите следующий вывод:
$ gcc -m32 m32.c
m32.c: In function ‘call’:
m32.c:4:12: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘long long unsigned int’ [-Wformat=]
printf("%lu,%d\n",a,b);
^
$ ./a.out
0,0
0,1
Очевидно, что первый printf неверный, но как видите, после printf неверный второй аргумент в printf, хотя я и не ожидал, что это тоже произойдет. И я не могу этого объяснить. Как это возможно?
-m32
в gcc не меняет тип типа данных. - person Gaurav Pathak   schedule 10.04.2017printf
неверен для типов, переданных для любой цели. УБ есть УБ. И ОП, видимо, знает об этом. - person too honest for this site   schedule 10.04.2017Get your stuff together, Jan. We've been working together for who knows how long and you're still writing UB? I thought you were better than this!
. Это УБ. Это не должно иметь смысла, потому что по определению не будет. - person Fund Monica's Lawsuit   schedule 11.04.2017