åˆå§‹åŒ–与赋值ä¸åŒï¼Ÿ

时间:2013-07-06 07:57:35

标签: c initialization assignment-operator

1.char str[] = "hello"; //legal  

2.char str1[];
str1 = "hello"; // illegal

我ç†è§£â€œhelloâ€ä»Žå­—符串文字池中返回字符串文字的地å€ï¼Œè¯¥åœ°å€ä¸èƒ½ç›´æŽ¥åˆ†é…给数组å˜é‡ã€‚在第一ç§æƒ…况下,将“helloâ€æ–‡å­—中的字符é€ä¸ªå¤åˆ¶åˆ°æ•°ç»„中,并在末尾添加“\ 0â€ã€‚

这是因为赋值è¿ç®—符“=â€åœ¨è¿™é‡Œè¢«é‡è½½ä»¥æ”¯æŒè¿™ä¸ªå—?

我还想知é“其他有趣的情况,其中åˆå§‹åŒ–与赋值ä¸åŒã€‚

4 个答案:

答案 0 :(得分:4)

ä¸èƒ½ 将其视为é‡è½½ï¼ˆæ— è®ºå¦‚何都ä¸å­˜åœ¨äºŽC中),因为使用字符串文字åˆå§‹åŒ–char数组是一ç§ç‰¹æ®Šæƒ…况。字符串文字的类型是const char[N],因此如果它类似于é‡è½½ï¼Œæ‚¨å°†èƒ½å¤Ÿä½¿ç”¨ç±»åž‹ä¸ºconst char[N]的任何表达å¼åˆå§‹åŒ–char数组。但你ä¸èƒ½ï¼

const char arr[3];
const char arr1[] = arr; //compiler error. Cannot initialize array with another array.

语言标准简å•åœ°è¯´å¯ä»¥ä½¿ç”¨å­—符串文字åˆå§‹åŒ–字符数组。由于他们对分é…没有任何说明,因此一般规则尤其适用于无法将数组分é…给。

对于åˆå§‹åŒ–与赋值ä¸åŒçš„其他情况:在C ++中,有引用和类,会有数以万计的例å­ã€‚在C中,没有完整的类或引用,我能想到的å¦ä¸€ä»¶äº‹å°±æ˜¯constå˜é‡ï¼š

const int a = 4; //OK;
const int b; //Error;
b = 4; //Error;

å¦ä¸€ä¸ªä¾‹å­ï¼šä½¿ç”¨å¤§æ‹¬å·è¿›è¡Œæ•°ç»„åˆå§‹åŒ–

int a[3] = {1,2,3}; //OK
int b[3];
b = {1,2,3}; //error

与结构相åŒ

答案 1 :(得分:3)

如果您想将其视为è¿ç®—符过载(å³ä½¿Cä¸ä½¿ç”¨è¯¥æœ¯è¯­ï¼‰ï¼Œæ‚¨å½“然å¯ä»¥è¿™æ ·åšã€‚

你还认为这是超载:

unsigned char x;
double y;

x = 2;
y = 1.243;

毕竟那些分é…完全ä¸åŒç±»åž‹çš„æ•°æ®ï¼Œä½†æ˜¯ä½¿ç”¨â€œç›¸åŒçš„è¿ç®—符â€ï¼Œå¯¹å—?

åªæ˜¯ä¸åŒï¼Œè¦åˆå§‹åŒ–或分é…。

å¦ä¸€ä¸ªå¾ˆå¤§çš„区别是你曾ç»èƒ½å¤Ÿåˆå§‹åŒ–结构,但是åŽæ¥çš„赋值没有相应的“struct literalâ€è¯­æ³•ã€‚从C99开始ä¸å†æ˜¯è¿™æ ·ï¼Œæˆ‘们现在有compound literals。

答案 2 :(得分:1)

char str[] = "hello";

是数组åˆå§‹åŒ–,使用C中定义的语法糖,因为字符串åˆå§‹åŒ–是如此常è§ã€‚编译器在程åºä¸­åˆ†é…一些固定内存并对其进行åˆå§‹åŒ–。数组(str)的å称计算为此内存的地å€ï¼Œå¹¶ä¸”无法更改,因为没有包å«è¯¥åœ°å€çš„å˜é‡ã€‚

Grijesh Chauhan解释了更多细节。

其他情况å–决于您的æ„æ€ã€‚扩展当å‰æ¡ˆä¾‹ï¼Œæ‚¨å¯ä»¥å¾ˆå®¹æ˜“地看到其他åˆå§‹åŒ–数组具有相åŒçš„属性,例如

int a[] = { 1, 2, 3, 4 };

答案 3 :(得分:0)

数组具有ä¸å¯ä¿®æ”¹çš„地å€ã€‚你需è¦ä¸€ä¸ªæŒ‡é’ˆä½œä¸ºå¯ä¿®æ”¹çš„左值。

通过分é…(å°è¯•ï¼‰ä¸€ä¸ªä¸å˜çš„字符串文字,你将获å–它的地å€ã€‚ä¸åŒçš„地å€ä¼šå¯¼è‡´éžæ³•è¡Œä¸ºã€‚

“helloâ€åœ¨å†…存中分é…一些空间并给出和解决。然åŽä½ æ‹¿å®ƒçš„地å€åˆå§‹åŒ–数组。