鱼C论坛

 找回密码
 立即注册
查看: 4921|回复: 18

如何判断类型

[复制链接]
发表于 2019-7-29 16:19:30 | 显示全部楼层 |阅读模式
2鱼币


如何判断一个完全未知的变量(变量名已知)的类型?
我要判断一个数是整数还是小数(浮点数),怎模板?
求助,谢谢...



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 16:38:39 | 显示全部楼层
type函数啊!float就是浮点型也就是小数,int是整数,str是字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-29 16:43:18 | 显示全部楼层
MMM啊 发表于 2019-7-29 16:38
type函数啊!float就是浮点型也就是小数,int是整数,str是字符串

undefined reference to `type'-->我问的是C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 16:47:44 | 显示全部楼层
juhugufudu 发表于 2019-7-29 16:43
undefined reference to `type'-->我问的是C语言

抱歉抱歉,我没看到你问的是c,哈哈,打扰打扰啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 20:41:11 | 显示全部楼层
if(a-(int)a==0.0){
        printf("a为整数");
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 21:21:13 | 显示全部楼层
用 sizeof() 操作符  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 22:27:48 | 显示全部楼层
本帖最后由 Croper 于 2019-7-29 22:29 编辑

使用sizeof可以判断出变量的长度,
使用类型转换后是否是原值能够判断出类型
这里是能够判断double,float,int,long long四种类型的代码,根据需要可以自行扩展
  1. #include <stdio.h>
  2. #define type32(a) (int)a==*(int*)&a?"int":"float"
  3. #define type64(a) (long long)a==*(long long*)&a?"long long":"double"
  4. #define type(a) sizeof(a)==sizeof(int)?type32(a):type64(a)
  5. int main(){
  6.         int a;
  7.         long long b;
  8.         float c;
  9.         double d;
  10.         printf("%s %s %s %s",type(a),type(b),type(c),type(d));//输出int long long float double
  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-29 23:04:26 | 显示全部楼层
本帖最后由 jackz007 于 2019-7-29 23:06 编辑

       对于 C 而言,int 和 float 的区别仅仅在于同样是 4 个字节的数据,就看你如何来解释它,如果按整型数来理解,就会有一个整型数值,如果按浮点数的理解,也会有相应的浮点数值。没有什么好办法来判断数据的具体类型。所以,C 在编译的时候,会对所有变量的类型进行严格的检查。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-30 09:02:45 | 显示全部楼层
是在什么时候判断?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-30 09:25:05 | 显示全部楼层
dt3tc 发表于 2019-7-29 20:41
if(a-(int)a==0.0){
        printf("a为整数");
    }

这个浮点数正好是一个整数的时候这个算法就失效了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-30 09:36:12 | 显示全部楼层
dt3tc 发表于 2019-7-29 20:41
if(a-(int)a==0.0){
        printf("a为整数");
    }
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a = 1;

  5.         if (a - (int)a == 0.0)
  6.         {
  7.                 a = a + 0.1;
  8.                 if (a - (int)a == 0.0)
  9.                         printf("这是一个整数\n");
  10.                 else
  11.                         printf("这是一个浮点数\n");
  12.         }
  13.         else
  14.                 printf("这是一个浮点数\n");

  15.         getchar();
  16.         return 0;
  17. }
  18. 对你的这个方法进行了改进,这样就可以判断了
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-30 17:24:24 | 显示全部楼层
本帖最后由 micolar 于 2019-7-30 17:33 编辑

楼主是否判断一个数是int 还是 float  
如果用sizeof 取的是字节数 对于一些编译器int和float 都是4个字节 所以是不行的

我就这么想 如果都是用4个字节来表示整数和小数
假如用00000000000000000000000000000001表示1
在我的机器上却用1065353216表示1.0  我是window2003 32位编译器
换位二进制
          111111100000000000000000000000 我不知道是前面补0还是后面补零

也就是说在机器上规定的32位表示int 和float 是不对等的 所以

  1. #include<stdio.h>
  2. int main(){
  3.         float a = 1; //假如是未知数
  4.         int* b = &a;  //取它的地址
  5.         printf("%d\n",*b); //把地址取到的32位二进制数 用int格式输出 注意 有时int不是32位   还有float类型多少位表示小数点后的数字也是不确定的  这要看编译器
  6.         if( *b == a)
  7.                 printf("int");
  8.         else
  9.                 printf("float");
  10.         printf("\n");




  11.         float* c = &a;
  12.         printf("%f\n",*c);
  13.         if( *c != a)
  14.                 printf("int");
  15.         else
  16.                 printf("float");
  17.         return 0;
  18. }
复制代码



当然这样还不严谨  如果遇到那种2个字节表示int就难受了 不过现在2个字节的比较罕见
而且我刚刚试了一个比较特殊的0  。。。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-31 20:52:11 | 显示全部楼层
micolar 发表于 2019-7-30 17:24
楼主是否判断一个数是int 还是 float  
如果用sizeof 取的是字节数 对于一些编译器int和float 都是4个字节 ...

当这个未知变量等于0的时候,你的这个算法就失效了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-1 11:02:48 | 显示全部楼层
Neverturnback 发表于 2019-7-31 20:52
当这个未知变量等于0的时候,你的这个算法就失效了

这还不简单 你把这个值加上或者减去一个非零的整型值 如果类型不匹配 编译器会帮你转换的 这样也可以判断的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-1 13:11:11 | 显示全部楼层
本帖最后由 Neverturnback 于 2019-8-1 13:16 编辑

可以了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-1 13:29:17 | 显示全部楼层
你的意思是不用内置函数,自己写一个吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-2 18:40:33 | 显示全部楼层
在网上找到的,地址https://blog.csdn.net/a1226860296b/article/details/82874284,用#include<typeinfo>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-3 10:54:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-6 08:32:41 | 显示全部楼层
你可以使用type()函数来解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 19:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表