[英]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 字符串並輸出其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, NULL, 10) );
Output:
float: -2.300000
long: -2
unsigned long: 4294967294
你可以用這些函數做更多花哨的東西(甚至用void *
指針做更多的事情),但它們都不能完全回答你的問題,因為 C 不直接支持你的問題。
這兩個建議都與語言的性質作斗爭。 如果要使用C,只需學習和使用支持的類型(或定義自己的,也很好支持)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.