我有一个代码,如下所示:
int main(void)
{
char mychar = 'd';
int *ptr = malloc(sizeof(*ptr)) ;
*ptr = (char) 'c' ; // *ptr = (char*) 'c'; Gives the exact same result
printf("%cn",*ptr);
memset(ptr,mychar,sizeof(*ptr));
printf("%cn",*ptr);
free(ptr);
printf("%cn",*ptr);
return 0 ;
}
该代码为指针样式强制转换和数据类型转换提供相同的结果。
应该使用这两种样式中的哪一种或被认为是一种很好的做法,为什么?
*ptr = (char) 'c' ;
*ptr = (char*) 'c';
两者都不是。
*ptr
和'c'
都属于int
型。无需石膏。
(是的,C 中的字符常量属于int
类型,而不是char
。这是违反直觉的,但有历史原因。请注意,C++字符常量的类型为char
.)
*ptr = (char) 'c';
中的强制转换相对无害;它将'c'
的int
值转换为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;
相反,但这只指定了在没有强制转换的情况下完成的相同转换。而且容易出错;它引入了弄错类型的机会,而不是让编译器为您处理它。
一般而言,应怀疑石膏。
两者都不好。
'c'
实际上是一个int
。所以你不必投掷。您可以直接分配它:
*ptr = 'c';