如何解决C 是否有等价于 var?
我想为程序设置一个具有任何值的变量。我能做的最好的事情是使用 var
,但 var
关键字在 C 中不存在。
我试过这个代码:
#include <stdio.h>
int main() {
var a = 2;
puts(a);
}
然后得到这些错误:
var.c:4:5: error: use of undeclared identifier 'var'
var a = 2;
^
var.c:5:10: error: use of undeclared identifier 'a'
puts(a);
^
如果不是 var
,那么它在 C 中的等价物是什么?
解决方法
用 C 编写的脚本语言设法为它们的变量实现这一点。然而,它相当复杂。
C 需要知道事物的大小,以便它可以正确地将它们放入内存中。变量必须始终具有已知的类型和大小。
为了有一个未知类型的变量,你需要创建一个像这样的结构(在我的脑海中,未经测试,但请参阅https://github.com/zlynx/type-union-test):
struct var {
enum {
INT,OBJ,DOUBLE,};
union {
long i;
void* p;
double d;
};
};
然后函数对一切进行操作。实现 OBJ 很有趣,因为你需要更多的结构来定义它是数组还是另一个 var 等。
无论如何。如果您希望在 C 中编程更容易,那么不要尝试这个。预先确定您的变量是什么。
,如果可以使用指针,可以使用void *
:
#include <stdio.h>
int main() {
char *s = "abc";
void *a = s;
puts(a);
return 0;
}
,
C 是静态类型的。这意味着所有变量都有特定类型,所有函数参数和返回值都有特定类型。此外,这意味着在分配变量、传递参数或返回值时,该值必须与指定类型匹配或在语言规则内兼容/可转换为该类型。
这可能看起来不方便,但 C 是一种系统级语言,能够直接与内存和 I/O 有效交互,并且在系统级语言中,强类型是必不可少的。有大量与支持弱类型语言相关的代码;在 C 中,它只是一个适当且固定大小的内存位置。
在您的示例中,您的变量中有一个整数值 2,但您想使用 puts()
打印一个字符串,该字符串需要一个 char*
参数来引用 NUL 终止的字符串。解决这个问题的惯用 C 方法是使用一个函数来生成整数值的字符串表示。因为 C 不会“神奇地”为您执行这种转换,所以它有一个库来处理最常见的转换和表示要求。在这种情况下:
#include <stdio.h>
int main()
{
int a = 2;
printf( "%d\n",a ) ;
}
在这种情况下,printf()
使用 %d
格式说明符将整数 2 表示为字符串 "2"
后跟一个换行符。字符串“2”是带有代码 0x32
或十进制 50(假设为 ASCII 编码)的字符。
如果您仍然认为您需要一个变体(因为在示例中很明显它根本没有必要),然后提出一个新问题,并提供一个更具体的示例来说明您要解决的问题 - 毫无疑问,您会得到显示如何用 C 解决问题的答案 - 并非所有解决方案都像这样简单。
,正如其他人已经提到的,在一天结束时,您需要知道变量的类型以便对它们进行处理。
除了 void *
指针,您还可以将所有内容都视为 c 字符串(以 nul
结尾的字符缓冲区),然后使用任何 C99 strto*
函数系列(float*、signed*、unsigned*)可按需将它们转换为预期类型。
例如,以下将 a
声明为 c 字符串并输出其 float
、long int
和 unsigned long
表示:
char *a = "-2.3";
printf( "float: %f\n",strtof(a,NULL) );
printf( "long: %ld\n",strtol(a,NULL,10) );
printf( "unsigned long: %lu\n",strtoul(a,10) );
输出:
float: -2.300000
long: -2
unsigned long: 4294967294
您可以使用这些函数做更多奇特的事情(甚至更多使用 void *
指针),但它们都不能完全回答您的问题,因为 C 不直接支持您提出的问题。
这两种建议都与语言的本质相悖。如果您要使用 C,只需学习和使用支持的类型(或定义您自己的,这也受到很好的支持)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。