尝试使代码具有联合结构。我将整数和printf扫描为int float,double,long double。然后将float print打印为int,float,double,long double。对double和long int执行相同的过程
以下代码:
union Data
{
int num_i;
float num_f;
double num_d;
long double num_ld;
};
int main()
{
union Data data;
printf("Int girin");
scanf("%d",&data.num_i);
printf("Int %d\n",data.num_i);
printf("Float %f\n",data.num_i);
printf("Double %Lf\n",data.num_i);
printf("Long DOuble %Ld\n",data.num_i);
printf("Float gir");
scanf("%f",&data.num_f);
printf("Int %d\n",data.num_f);
printf("Float %f\n",data.num_f);
printf("Double %Lf\n",data.num_f);
printf("Long DOuble %Ld\n",data.num_f);
printf("Double Gİr");
scanf("%lf",&data.num_d);
printf("Int %d\n",data.num_d);
printf("Float %f\n",data.num_d);
printf("Double %lf\n",data.num_d);
printf("Long DOuble %ld\n",data.num_d);
printf("Long gir ");
scanf("%ld",&data.num_ld);
printf("Int %d\n",data.num_ld);
printf("Float %f\n",data.num_ld);
printf("Double %lf\n",data.num_ld);
printf("Long DOuble %ld\n",data.num_ld);
getch();
}
答案 0 :(得分:2)
此代码调用未定义的行为。对数据类型使用错误的转换规范会调用未定义的行为。
如果转换规范无效,则行为未定义.282)如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。
如果是UB,所有投注均已关闭。
答案 1 :(得分:1)
我认为您希望演示使用联合打印不同类型而不进行投射
printf("Int girin");
scanf("%d",&data.num_i);
printf("Int %d\n",data.num_i);
printf("Float %f\n",data.num_f);
printf("Double %Lf\n",data.num_d);
printf("Long DOuble %Ld\n",data.num_ld);
答案 2 :(得分:0)
好的,要打印一个数字作为另一种类型的数字,你应该首先对其进行类型转换或沿着那些行进行类比转换。例如;
int a = 10;
double b = 5.5;
如果我想分别打印它们作为double
和int
,那么我应该执行以下操作:
// %f looks for a double
printf( "%f\n", (double) a );
printf( "%d\n", (int) b );
// output would be:
// 10.000000
// 5
关于你的union
,我不确定你手上有什么,但是你一遍又一遍地覆盖同一个记忆位置,每个scanf
呼叫。 union
内的元素共享相同的内存位置,内存位置足以容纳最大元素。
所以,要小心。如果您想在结尾处拥有全部4个,则应考虑使用struct
代替union
。
答案 3 :(得分:0)
1)将字段与scanf()
和printf()
的正确格式说明符匹配。这也意味着并非所有警告都已启用。启用它们。
2)零填充data
因为联合字段的scanf()
可能无法完全设置联合中的所有位。
3)添加了十六进制转储。
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
#include <memory.h>
union Data {
int num_i;
float num_f;
double num_d;
long double num_ld;
};
void uprintf(const union Data *data) {
printf("Int %d\n", data->num_i);
printf("Float %f\n", data->num_f);
printf("Double %lf\n", data->num_d);
printf("Long Double %Lf\n", data->num_ld); // was %Ld and %ld
unsigned char *x = (void *) data;
printf("hex ");
for (size_t i = 0; i < sizeof(*data); i++)
printf(" %02X", *x++);
printf("\n");
}
int main() {
union Data data;
memset(&data, 0, sizeof(data));
printf("Int girin");
scanf("%d", &data.num_i);
uprintf(&data);
memset(&data, 0, sizeof(data));
printf("Float gir");
scanf("%f", &data.num_f);
uprintf(&data);
memset(&data, 0, sizeof(data));
printf("Double Gİr");
scanf("%lf", &data.num_d);
uprintf(&data);
memset(&data, 0, sizeof(data));
printf("Long gir ");
scanf("%Lf", &data.num_ld); // was "%ld"
uprintf(&data);
//getch();
return 0;
}