簡體   English   中英

C 是否與 var 等效?

[英]Does C have an equivalent to 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 需要知道東西的大小,才能正確放入 memory。 變量必須始終具有已知的類型和大小。

為了有一個未知類型的變量,您需要創建一個類似這樣的結構(在我的腦海中,未經測試,但請參閱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 是靜態類型的。 這意味着所有變量都具有特定類型,並且所有 function arguments 和返回值都具有特定類型。 此外,這意味着在分配變量、傳遞參數或返回值時,該值必須與指定的類型匹配或在語言規則內兼容/可轉換為該類型。

這可能看起來不方便,但 C 是一種系統級語言,能夠直接與 memory 和 I/O 有效地交互,並且在系統級語言中強類型是必不可少的。 有大量與支持弱類型語言相關的代碼; 在 C 中,它只是一個適當且固定大小的 memory 位置。

在您的示例中,您的變量中有一個 integer 值 2,但是您想使用puts()打印一個字符串,該字符串需要一個char*參數來引用 NUL 終止的字符串。 解決此問題的慣用 C 方法是使用 function 生成 integer 值的字符串表示形式。 因為 C 不會“神奇地”為您執行轉換,所以它有一個庫來處理最常見的轉換和表示要求。 在這種情況下:

#include <stdio.h>

int main() 
{
    int a = 2;
    printf( "%d\n", a ) ;
}

在這種情況下, printf()使用%d格式說明符將 integer 2 顯示為字符串"2" ,后跟換行符。 字符串“2”是代碼為0x32或十進制 50 的字符(假設為 ASCII 編碼)。

如果您仍然認為您需要一個變體,(因為在示例中很明顯它根本沒有必要),然后提出一個新問題,並提供一個您嘗試解決的問題的更具體示例 - 您無疑會得到一個顯示的答案如何解決 C 中的問題 - 並非所有解決方案都如此簡單。

正如其他人已經提到的那樣,歸根結底,您需要知道變量的類型才能對它們進行處理。

除了void *指針,您還可以將所有內容視為 c 字符串(以nul結尾的字符緩沖區),然后使用任何C99 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) );

Output:

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

你可以用這些函數做更多花哨的東西(甚至用void *指針做更多的事情),但它們都不能完全回答你的問題,因為 C 不直接支持你的問題。

這兩個建議都與語言的性質作斗爭。 如果要使用C,只需學習和使用支持的類型(或定義自己的,也很好支持)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM