是否有三元运算符参数的隐式类型转换规则?
三元运算符总是需要返回相同的类型.此类型仅由第二个和第三个参数(1st ? 2nd : 3rd)确定,因此两个参数都转换为此类型.这种类型是如何确定的?
更具体地说,我测试了一个例子:
class pointclass
{
pointclass();
pointclass( int i ); // (pointclass)(int)
operator bool() const; // (bool)(pointclass)
};
Run Code Online (Sandbox Code Playgroud)
我有一个类(pointclass),它使从隐式转换int到pointclass和从隐式转换pointclass到bool.
int i;
pointclass p;
bool b;
b ? p : i; // (bool) ? (int)(bool)(pointclass) : (int)
b ? i : p; // (bool) ? (int) : (int)(bool)(pointclass)
Run Code Online (Sandbox Code Playgroud)
使用三元运算符,我比较pointclass和int.编译器使用从隐式转换pointclass到bool,然后从标准转换bool到int.无论我是否交换第二和第三个参数,这都已完成.为什么不转换int为 …
我目前在理解UML中的三元关联方面遇到了一些麻烦.我得到二进制的,但我不确定如何在三元组上进行多重性.我正在做我从大学毕业的练习,目前的练习是这样的:
一个部门可能会销售许多产品,但仅限于一个市场.在市场上,一个产品只能由一个部门出售.
我已经阅读了不同的消息来源,关于我应该如何思考这两个类的一对,我并不是想弄清多重性,但是我的大脑并没有得到它.帮帮我Overflow Kenobi,你是我唯一的希望.
似乎没有办法在两个字节上使用C#的三元运算符,如下所示:
byte someByte = someBoolean ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)
该代码当前无法使用"无法将源类型'int'转换为目标类型'byte'"进行编译,因为编译器将这些数字视为整数.显然没有指定的后缀表示0和1是字节,所以唯一的解决方法是(a)将结果转换为字节或(b)使用if-else控件.
有什么想法吗?
这个Java程序使用一个三元if来映射布尔值到输出字符串:("*"表示true,空字符串表示false).
public class ternary {
public static void main(String[] args) {
boolean flags[]={true,false,true};
for (boolean f : flags) {
System.out.println(f?"*":"");
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以输出是*,[empty],*.
我有一个输入XML文档,如:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="change.xsl"?>
<root>
<change flag="true"/>
<change flag="false"/>
<change flag="true"/>
</root>
Run Code Online (Sandbox Code Playgroud)
我有以下XSLT模板,它将true映射为'*',false映射为''(它可以工作):
<xsl:template match="change">
<xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/>
<xsl:value-of select="$flag"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
是否有更简洁的版本?
a)我可以直接从字符串'true | false'自动获取布尔值true | false的值吗?b)是否有(xpath?)构造将布尔值true | false映射到'*',''?
当我偶然发现一个类似于此的构造时,我正在重构一些旧代码:
// function bar() returns a value
// if the value is an instance of customException class, terminate with error code
// else process the regular data
$foo = bar();
checkForException($foo) && exit($foo->errorCode());
process($foo);
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很奇怪,但是它要短得多
$foo=bar();
if(checkForException($foo)) {
exit($foo->errorCode();
}
else {
process($foo);
}
Run Code Online (Sandbox Code Playgroud)
并且稍微更具可读性(至少在最初的惊喜之后)
$foo=bar();
(checkForException($foo)) ? exit($foo->errorCode()) : process($foo);
Run Code Online (Sandbox Code Playgroud)
虽然较短的代码并不一定意味着更易读的代码,但我发现这是在上面两种"标准"方式的中间.
换句话说,而不是
if($foo) {
bar();
}
else {
// there is no real reason for this to exist, since
// I have nothing to write here, but I want …Run Code Online (Sandbox Code Playgroud) template <typename T1, typename T2>
auto max (T1 a, T2 b) -> decltype(b<a?a:b);
Run Code Online (Sandbox Code Playgroud)
template <typename T1, typename T2>
auto max (T1 a, T2 b) -> decltype(true?a:b);
Run Code Online (Sandbox Code Playgroud)
I do not understand why these two code snippets can have the same effect. Plz give me some hint and a underlying explanation.
Cheers.
我有一个问题,我有八个可以包含 0、1 或 2 的元素。我可以很容易地用 16 位来表示它,但是出于 SIMD 效率的原因,我需要它占据 13 位(它不是唯一存在的东西)在车道)。
幸运的是,2^13==8192, 和3^8==6561,所以我想要的状态可以适合。然而,这就是事情变得有趣的地方。天真地,我只是通过计算三元数字状态来表示这些状态。例如,要表示 tritmask 0t12211012(尽管我将使用它作为示例),我可以只写0t12211012 = 2*3^0+1*3^1+0*3^2+1*3^3+1*3^4+2*3^5+2*3^6+1*3^7 = 4244 = 0b1000010010100.
我有一组我需要支持的操作:
0t12211012并且我希望将 a2放在保持零的位置,我可以简单地添加0t200=18. (请注意,转换为 tritspace 很容易,因为我只有 8 个 trit,所以我可以将基本幂存储在寄存器中并使用 pshufw 对其进行索引)。0t12211012,我希望能够提取位掩码 for 0,即0b00000100, for 1,即0b10011010,和 for 2,即0b01100001。这我还没有想出该怎么做,这就是我想要的帮助。如何在适用于 x86 SIMD 的少量操作中做到这一点?谢谢!
20 年 18 月 11 日编辑:举一个我认为太慢的方法的例子:我们可以迭代地找到值 mod 3 并除以 3 以从表示的最不重要的一端拉出trits,然后以这种方式组装掩码. …
是否有像代码那样的理解/可维护性问题
inVar1 == 0 ? NULL : v.push_back(inVar1);
inVar2 == 0 ? NULL : v.push_back(inVar2);
Run Code Online (Sandbox Code Playgroud)
等等.
可能令人困惑的想法是使用三元运算符来进行程序流而不是变量赋值,这是通常的解释.
我没有看到解决这种用法的工作中的编码标准,所以虽然我很乐意这样做,但我想知道是否有充分的理由不这样做.
在许多棋盘游戏中(如跳棋,go和othello/reversi),每个方块可以用三种状态表示:白色,黑色或空白.
这种游戏引擎中的8x8板通常表示为两个位板:一个64位整数用于白色位置,另一个64位整数用于黑色.
然而,当存储本地游戏模式时,这种二进制表示可能需要大量空间.例如,为8平方行的所有可能值创建查找表将需要具有256*256 = 4 ^ 8 = 65536值的数组,而仅有3 ^ 8 = 6561个可能位置(因为正方形永远不可能是被黑色和白色片段占据).
另一种方法是将电路板存储为三元数 - 所谓的标题.但我没有找到任何在两个二进制整数表示和三元整数表示之间转换的快速算法.
因此,我的问题是
有没有一种有效的方法来转换(编码)三个数字中的两个互斥二进制数(w & b == 0),这样每个唯一的这样的整数对将被映射到一个唯一的整数?(最好用C/C++.)
Python示例
这是我的Python解决方案:
white_black_empty = lambda w, b: int(format(w, 'b'), base=3) + \
int(format(b, 'b'), base=3)*2
Run Code Online (Sandbox Code Playgroud)
示例值:
我的表达式如下所示: -
while (count)
{
...
...
index = ((count == 20)? 0 : index++);
...
...
}
Run Code Online (Sandbox Code Playgroud)
现在三元运算符是C中的序列点,但我相信序列点在测试部分结束.
这种理解是否正确,因此这种说法会导致未定义的行为?