【问题标题】:Casting syntax practice铸造语法练习
【发布时间】:2012-09-28 09:08:09
【问题描述】:

我有一个类似的代码:

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';

【问题讨论】:

  • 尝试打开编译器警告?
  • 我认为它们都不好,因为您将 char 分配给 int。

标签: c pointers syntax


【解决方案1】:

都没有。

*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;

相反,但这只是指定了在没有强制转换的情况下会完成的相同转换。而且容易出错;它引入了错误类型的机会,而不是让编译器为您处理它。

一般来说,演员阵容应该被怀疑。

【讨论】:

    【解决方案2】:

    两者都不好。

    'c' 实际上是一个int。所以你不必投。可以直接赋值:

    *ptr = 'c';
    

    【讨论】:

    • 我会选择 Heisenbug:两个 OP 的演员阵容都同样糟糕,因为这两个演员实际上都没有转换为左侧类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多