Ric*_*red 39 c gcc qemu conditional-operator android-emulator
在Android开源qemu代码中,我遇到了这行代码:
machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
Run Code Online (Sandbox Code Playgroud)
这只是一种令人困惑的说法:
if (machine->max_cpus) {
; //do nothing
} else {
machine->max_cpus = 1;
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,那就不会更清楚了:
if (machine->max_cpus == 0) machine->max_cpus = 1;
Run Code Online (Sandbox Code Playgroud)
有趣的是,这可以编译并与gcc一起使用,但不能在http://www.comeaucomputing.com/tryitout/上编译.
Uri*_*Uri 50
这在GNU中是允许的,是C的一个模糊扩展
5.7具有省略操作数的条件
可以省略条件表达式中的中间操作数.然后,如果第一个操作数非零,则其值为条件表达式的值.
因此,表达
Run Code Online (Sandbox Code Playgroud)x ? : y如果非零,则其值为x; 否则,y的值.
这个例子完全等同于
Run Code Online (Sandbox Code Playgroud)x ? x : y在这个简单的例子中,省略中间操作数的能力并不是特别有用.当它变得有用时是第一个操作数,或者可能(如果它是一个宏参数),包含副作用.然后在中间重复操作数将执行两次副作用.省略中间操作数使用已经计算的值而没有重新计算它的不良影响.
正如您可能猜到的那样,出于可读性和可移植性的原因,建议不要这样做.老实说,我很惊讶地看到这种语法不兼容的扩展.
Mic*_*zek 10
这是一个GCC扩展,意思是"如果条件为真,则使用它,否则使用其他值",所以
machine->max_cpus = machine->max_cpus ?: 1;
Run Code Online (Sandbox Code Playgroud)
是简写
machine->max_cpus = machine->max_cpus ? machine->max_cpus : 1;
Run Code Online (Sandbox Code Playgroud)
虽然如果条件有副作用,它只会运行一次
| 归档时间: |
|
| 查看次数: |
6569 次 |
| 最近记录: |