computer:c:tips:assignment_conversions
赋值转换(Assignment conversions)
赋值表达式两边的表达式类型应该是一样的,当不一样时,则发生转换。
需要特别关注的是指针赋值规则:左边指针指向的类型必须拥有右边指针指向类型的所有类型限定符(type qualifier),此外,左边指向的类型要与右边指向类型相兼容(参见:类型兼容性)。即:
T1 *p; T2 *q; p = q;
T1类型要有T2类型的所有限定符,并且T1与T2(去除限定符后)兼容。
例如:
char *a = "abcd"; const char *b; b = a;
这里T1为const char,T2为char,T1拥有T2的所有限定符,此外,char与char兼容,所以该赋值操作是合法的。
但下面这个例子就不行:
char *str = "abcd"; char **a = &str; const char **b; b = a;
编译器会产生类似的警告信息:warning: assignment from incompatible pointer type(从不兼容的指针类型赋值)。
原因如下:
- T1类型是const char *;
- T2类型是char *;
- T1与T2都没有类型限定符,这里const char *是一个指向具有const限定符的char类型的指针,即const修饰的是char,不是指针本身;
- T1与T2不兼容,因为const char与char不兼容。
如下的代码就合法了(分析方法同上):
char *str = "abcd"; char **a = &str; char * const *b; b = a;
computer/c/tips/assignment_conversions.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1