你好,
我想知道这些作业中哪一项更快、更安全、更好等,以及可能的原因:
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);
谢谢。
最佳答案
关于速度,这至少与选择 2 一样快:
bSize = 128 << (choice == 'y' || choice == 'Y');
对于我来说,这是否比选择 1 更快并不是显而易见的。然而,为了在未知平台上调整性能,我认为我喜欢选择 2 的建议变体。原因是,在硬件级别,选择 2(原始或变体)不涉及重新加载程序计数器,而是调用相对简单的移位寄存器操作,涉及相对较少的晶体管。 (实际上,如果您想真正了解它的技术,我知道这种转变可能是通过多路复用来完成的。要详细说明这一点对于当前格式来说太多了,但重点是(choice == 'y' || choice == 'Y')
的输出有效地直接通过管道传输到多路复用器的控制线之一。无论如何,它真的很快。)
关于是否可以按照建议的方式安全地使用评估条件,ISO/IEC 9899:1999 (E),第 1 节。 6.5.14.3,保证人们可以安全地做到这一点。它写道:“如果 || 运算符的任一操作数与 0 比较不等于 0,则其结果为 1;否则,结果为 0。结果类型为 int。”
(@PaulR 正确地观察到,像这个答案提供的电子理论考虑因素并不是决定性的。必须在实际平台上分析实际代码才能确定哪个更快。这也不仅仅是 @PaulR 方面的狡辩. 可以说选择 2会更快,但这并不意味着更快。取决于所使用的 CPU、分支预测或其他硬件可以促进选择 1,如果确实如此,我也不会感到非常惊讶。)
关于c - c/c++ 中根据条件进行一行赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366436/