C 是否有等价于 var?

时间:2021-05-14 19:00:11

标签: c variables var equivalent

我想为程序设置一个具有任何值的变量。我能做的最好的事情是使用 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 中的等价物是什么?

4 个答案:

答案 0 :(得分:3)

用 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 中编程更容易,那么不要尝试这个。预先确定您的变量是什么。

答案 1 :(得分:0)

如果可以使用指针,可以使用void *

#include <stdio.h>

int main() {
 char *s = "abc";
 void *a = s;
 puts(a);

 return 0;
}

答案 2 :(得分: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 解决问题的答案 - 并非所有解决方案都像这样简单。

答案 3 :(得分:0)

正如其他人已经提到的,在一天结束时,您需要知道变量的类型以便对它们进行处理。

除了 void * 指针,您还可以将所有内容都视为 c 字符串(以 nul 结尾的字符缓冲区),然后使用任何 C99< /strong> strto* 函数系列(float*signed*unsigned*)可按需将它们转换为预期类型。

例如,以下将 a 声明为 c 字符串并输出其 floatlong intunsigned 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, NULL, 10) );

输出:

float: -2.300000
long: -2
unsigned long: 4294967294

您可以使用这些函数做更多奇特的事情(甚至更多使用 void * 指针),但它们都不能完全回答您的问题,因为 C 不直接支持您提出的问题。

这两种建议都与语言的本质相悖。如果您要使用 C,只需学习和使用支持的类型(或定义您自己的,这也受到很好的支持)。