【发布时间】:2020-05-30 17:01:28
【问题描述】:
谁能向我解释一下这个声明在 C++ 中的含义;我从未见过这样声明的东西,只是对它的含义和工作原理感到困惑:
int ix((dx > 0) - (dx < 0));
这个声明也一样:
int error(dy - (dx >> 1));
【问题讨论】:
标签: c++ initialization boolean implicit-conversion
谁能向我解释一下这个声明在 C++ 中的含义;我从未见过这样声明的东西,只是对它的含义和工作原理感到困惑:
int ix((dx > 0) - (dx < 0));
这个声明也一样:
int error(dy - (dx >> 1));
【问题讨论】:
标签: c++ initialization boolean implicit-conversion
您可以使用括号或大括号中的初始化器来声明标量对象。
在此声明中
int ix((dx > 0) - (dx < 0));
这里使用表达式(dx > 0) - (dx < 0) 作为初始化器。
如果 dx 大于 0,则子表达式 (dx > 0) 的计算结果为布尔值 true,而此子表达式 (dx < 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 >> 1 将变量dx 的位右移一位。它等价于表达式dx / 2。
例如,如果dx 等于 6,那么它的二进制表示是(为简单起见,我将只使用一个字节)
0000 0110
右移一位你会得到
0000 0011
这是 3 的二进制表示。
很难说为什么在这个声明中使用了这个初始化器
int error(dy - (dx >> 1));
不知道使用它的上下文。
【讨论】:
dx)有用/清晰/良好的风格,或者您会使用其他方法来实现相同的效果吗?因为我正在学习而询问并想知道这是否是我应该使用的东西。
默认情况下,当您在 C++ 中编写 int var; 和 int var = int(); 之类的内容时,var 的值将在第一种情况下未初始化,而在第二种情况下将设置为零。
您的示例的行与以下内容相同:
int ix = (dx > 0) - (dx < 0);
int error = dy - (dx >> 1);
另外,
dx > 0 和 dx < 0 是 0 或 1,dx >> 1 将 dx 除以 2。
在线:int ix((dx > 0) - (dx < 0));
【讨论】:
< 和 > 是 运算符,类似于 +、* 等。但它们返回的不是数字,而是 bool :true 或false,可以隐式转换为整数1 和0。