响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


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