2012-09-28 49 views
0

我有是这样一个代码:铸造语法练习

int main(void) 
{ 
    char mychar = 'd'; 
    int *ptr = malloc(sizeof(*ptr)) ; 

    *ptr = (char) 'c' ; // *ptr = (char*) 'c'; Gives the exact same result 

    printf("%c\n",*ptr); 
    memset(ptr,mychar,sizeof(*ptr)); 
    printf("%c\n",*ptr); 
    free(ptr); 
    printf("%c\n",*ptr); 
    return 0 ; 
} 

的代码提供指针样式转换和数据类型投相同的结果。
这两种风格中哪一种应该使用或被认为是一种好的做法,为什么?

*ptr = (char) 'c' ; 
*ptr = (char*) 'c'; 
+2

试图打开你的编译器警告? – Mat

+1

我认为他们都不是很好,因为你正在给int分配一个char。 – Heisenbug

回答

7

都不是。

*ptr'c'都是int类型。没有演员是必要的。

(是的,在C字符常量是int类型,而不是char的,这是违反直觉的,但也有其历史原因的。需要注意的是C++字符常量是char类型。)

*ptr = (char) 'c';演员是相对无害的;它会将int的值'c'转换为char,并且结果会隐式转换回int。由于c保证可表示为char,因此不会导致错误。

*ptr = (char*) 'c';,你的编译器应该给你一个错误信息。您将常量int值转换为指针,然后将该指针值分配给int而不进行强制转换。这是“违反约束条件”,这意味着符合标准的编译器必须对其进行诊断。如果你的不这样做,找出如何让它这样做。

如果作业经过编译器,它可能会可能做你想做的。整数类型和指针类型之间的转换通常只是重新解释指定表示的位,因此将int转换为char*并返回int很可能会为您提供原始的int值。但不能保证。

即使在不同的算术类型之间,转换通常也是不必要的。例如,如果你这样写:

char ch = 'c'; 
int i; 
i = ch; 

在这种情况下,分配的右侧真的是char型的,因为它是类型的对象,而不是一个字符常量的名称。分配含蓄ch的值从类型char转换为类型int。您可能写:

i = (int)ch; 

代替,但只是规定,将已没有投做了同样的转换。而且很容易出错;它引入了让类型错误的机会,而不是让编译器为你处理它。

一般情况下,铸件应该被怀疑。

1

两者都不好。

'c'其实是一个int。所以你不必投。您可以直接指定它:

*ptr = 'c'; 
+0

我会和Heisenbug一起去的:这两个OP的阵容都是同样糟糕的,因为这两个阵容实际上都不是左边阵型。 – DevSolar