【问题标题】:Declaring an int in C++ with <<用 << 在 C++ 中声明一个 int
【发布时间】:2020-05-30 17:01:28
【问题描述】:

谁能向我解释一下这个声明在 C++ 中的含义;我从未见过这样声明的东西,只是对它的含义和工作原理感到困惑:

int ix((dx > 0) - (dx < 0));

这个声明也一样:

int error(dy - (dx >> 1));

【问题讨论】:

    标签: c++ initialization boolean implicit-conversion


    【解决方案1】:

    您可以使用括号或大括号中的初始化器来声明标量对象。

    在此声明中

    int ix((dx > 0) - (dx < 0));
    

    这里使用表达式(dx &gt; 0) - (dx &lt; 0) 作为初始化器。

    如果 dx 大于 0,则子表达式 (dx &gt; 0) 的计算结果为布尔值 true,而此子表达式 (dx &lt; 0) 的计算结果为布尔值 false。因此,表达式为true - false,其中布尔值隐式转换为 1 表示真,0 表示假。因此,如果 dx 大于 0,您将得到 1。

    如果dx 小于0,您将得到-1

    如果dx 等于0,那么这两个子表达式的计算结果都为false,您将得到0

    因此,变量 ix 被初始化为 1 或 0 或 -1,具体取决于 dx 是否大于等于或小于 0。

    在此声明中

    int error(dy - (dx >> 1));
    

    使用按位右移运算符dx &gt;&gt; 1 将变量dx 的位右移一位。它等价于表达式dx / 2

    例如,如果dx 等于 6,那么它的二进制表示是(为简单起见,我将只使用一个字节)

    0000 0110
    

    右移一位你会得到

    0000 0011
    

    这是 3 的二进制表示。

    很难说为什么在这个声明中使用了这个初始化器

    int error(dy - (dx >> 1));
    

    不知道使用它的上下文。

    【讨论】:

    • 嘿,弗拉德,你似乎知道很多。您是否发现第一个表达式(带有dx)有用/清晰/良好的风格,或者您会使用其他方法来实现相同的效果吗?因为我正在学习而询问并想知道这是否是我应该使用的东西。
    • @rezi 是普通风格。此类表达式通常用于 C 标准函数(如 qsort 或 bsearch)中的比较函数。
    【解决方案2】:

    默认情况下,当您在 C++ 中编写 int var;int var = int(); 之类的内容时,var 的值将在第一种情况下未初始化,而在第二种情况下将设置为零。

    您的示例的行与以下内容相同:

    int ix = (dx > 0) - (dx < 0);
    int error = dy - (dx >> 1);
    

    另外, dx &gt; 0dx &lt; 0 是 0 或 1,dx &gt;&gt; 1dx 除以 2。

    在线:int ix((dx &gt; 0) - (dx &lt; 0));

    • 如果 dx > 0,则 ix = 1
    • 如果 dx = 0,则 ix = 0
    • ix = -1 如果 dx

    【讨论】:

    • 嗯,我仍然对那些感到困惑,因为 是比较符号。它们在这种情况下是否像 if 语句一样工作?
    • @JohnsonMain &lt;&gt;运算符,类似于 +* 等。但它们返回的不是数字,而是 booltruefalse,可以隐式转换为整数10
    • @André Caceres 我问了另一个问题,这可能会给出上下文
    猜你喜欢
    • 2010-10-30
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2016-05-15
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多