【问题标题】:which one of these is an example of coercion其中哪一个是强制的例子
【发布时间】:2012-11-27 08:44:27
【问题描述】:

我一直在思考关于强制的多项选择题。 4 个示例 a、b、c 或 d 之一是强制示例。我将其缩小到 A 或 B。但我在两者之间进行选择时遇到了问题。甘蔗有人请解释为什么一个是强制的,一个不是。

一)

string s="tomat";
char c='o';
s=s+c;

我认为 A 可能是正确的,因为我们添加了两种不同的类型,字符和字符串。这意味着 c 被提升为字符串,因此是强制的。

B)

double x=1.0;
double y=2.0;
int i=(int)(x+y);

我还认为 B 是正确答案,因为双精度 (x+y) 被转换为 int 以放置在 i 中。但我认为这可能是错误的,因为它是通过使用 (int) 主动完成的,而不是被动的,例如 "int i = x + y"

我会列出其他两个选项,尽管我认为这两个选项都不是正确答案

C)

char A=0x20;
A = A << 1 | 0x01;
cout << A << endl;

D)

double x=1.0;
double y=x+1;
return 0;

我不只是在寻找答案,而是在寻找解释。我已经阅读了大量关于强制的内容,A 和 B 看起来都是正确的答案。那么为什么一个正确而另一个不正确。

【问题讨论】:

    标签: coercion


    【解决方案1】:

    我不认为类型转换等同于类型强制,这就是为什么 A 可能是正确的答案。

    B 接受一个 double 并将其转换为一个 int,这更像是转换而不是强制。在 A 中,您没有转换任何隐含的内容。您是在告诉运行时/编译器/无论“这两件事很相似,您能弄清楚如何连接它们吗?”

    C 不是转换或强制转换,它只是位移。虽然 cout 可能是强制的......我不确定是否有强制写入到控制台的字符串。

    D 可能包含一个强制,因为 1 是一个 int 并且您将它添加到一个 double 中。但是,您可以使用具有小数的整数进行浮点数学运算,这更加明确。

    我认为 A 是最直接的强制示例。虽然 C 的 cout 声明似乎也很可疑。

    【讨论】:

    • 我认为转换和强制转换在 CS 方面几乎是等价的。 (en.wikipedia.org/wiki/Type_conversion)
    • @GJK 强制的定义是它是隐式的。强制转换是显式的:stackoverflow.com/questions/8857763/… 强制这个词也暗示它是隐含的 (ha)。
    • 我明白了,是的,你是对的。那我不得不同意你的看法。因为现在我想起来了,这些不是 C 字符串(字符数组),它们是 C++ 字符串(可能),所以 A 可能是正确的答案。
    【解决方案2】:

    我实际上认为它是 B。即使有明确的 (int),它仍然是类型强制(只是不是自动类型强制)。您正在将浮点值(可能存储为 IEEE 浮点值)转换为整数值(可能存储在二进制补码中)。

    而 A 只是将一个字符连接到一个字符串,其中一个字符串只是一个以空字符结尾的字符数组。那里没有进行数据类型转换,只是进行了一些内存操作。

    我可能是错的。

    编辑:我必须同意 Parris。鉴于这是一个 C++ 字符串而不是 C 字符数组(我的错误),A 中的字符可能被强制转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多