c - c/c++ 中根据条件进行一行赋值

标签 c conditional-statements variable-assignment

你好,

我想知道这些作业中哪一项更快、更安全、更好等,以及可能的原因:

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/

相关文章:

c - 当字符串的长度大于 n 时,如何打印字符串的前 n 个字节?

c++ - 为什么 C 和 C++ 支持在结构中按成员分配数组,但通常不支持?

c - 这个 C 结构赋值是什么意思?

xpath - xpath多重条件并返回根

javascript - 数组声明和赋值 (JavaScript)

c - Golang (cgo) - 支持带有 cgo 的嵌套结构?

使用 switch 语句将数字(最多 4 位)转换为单词(C 程序)

C scanf格式化

java - 第二个条件替代 for 循环

java - 我想要 Do - While 循环,包括 If Else 语句