您好,
我想知道这些作业中的哪一个更快,更安全,更好等等,可能也是原因:
int choice = fgetc(stdin);
unsigned int bSize;
choice = fgetc(stdin)
1:
bSize = (choice == 'y' || choice == 'Y') ? 256 : 128;
2:
bSize = 128 + ((choice == 'y' || choice == 'Y') << 7);
感谢。
答案 0 :(得分:1)
关于速度,这至少与选择2一样快:
bSize = 128 << (choice == 'y' || choice == 'Y');
是否比选择1更快对我来说不是很明显。但是,为了在未知平台上调整性能,我认为我喜欢选择2的建议变体。原因是,在硬件级别,选择2(原始或变体)不涉及重新加载程序计数器,而是调用相对简单的移位寄存器操作,涉及相对较少的晶体管。 (实际上,如果你想真正了解它,我会理解这种转变可能是通过多路复用完成的。对于目前的格式来说,这个细节太多了,但重点是(choice == 'y' || choice == 'Y')
的输出有效地直接传输到多路复用器的控制线之一。无论如何,它真的很快。)
关于是否可以按照建议的方式安全地使用评估条件,ISO / IEC 9899:1999(E),第2节。 6.5.14.3,保证人们可以安全地做到这一点。它读取:“如果||运算符的任何一个操作数比较不等于0,则||运算符将产生1;否则,它产生0.结果的类型为int。”
(@ PaulR正确地观察到电子理论上的考虑因素,例如这个答案所提供的并不是决定性的。必须在实际平台上描述实际代码,以确定哪个更快。这也不仅仅是@ PaulR的部分狡辩很好地认为选择2 会更快,但这并不意味着 更快。取决于使用的CPU,分支预测或其他硬件可以促进选择1,如果确实如此,我也不会感到非常惊讶。)
答案 1 :(得分:-1)
在我看来,“选择1”是“更快”,因为在比较之后只进行了一次分配操作。在'选择2'中它确实'+'和'&lt;&lt;'以及比较部分。 '选择1'是'更安全',因为它比其他选择更具可读性,因此程序员在编写错误时更不容易出错。由于前两个原因,选择1“更好”。