为了回答这个问题,我相信还需要回答一些其他问题。
为什么有一个?:
C 语言中的运算符以及为什么它更好
比if-else
?
据我所知,除了陈述自己的主观意见外,没有人能够回答这个问题。 K&R 2.11 指出
“条件表达式通常会产生简洁的代码。”
然后他们用这一行来说明这一点
printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' ');
这是他们自己主观的、模糊的意见。就我个人而言,我相信
printf("%6d", a[i]);
if(i%10==9 || i==n-1)
printf("\n");
else
printf(" ");
更加清晰,因为我可以在 10 秒内阅读和理解该代码,而不是花 1 分钟阅读和理解 K&R 版本。另外,我的代码将整数打印与不相关的格式分开。但当然,那就是my主观意见,没有明显的对错。
至于官方消息,C99 基本原理版本 5.10、6.5.15 也没有真正提到为什么需要 ?: 运算符。它主要只是说明新标准中操作员的行为发生了变化:
条件语句中间操作数的语法限制
运营商已经放宽,包括的不仅仅是
逻辑或表达式:几个现有的实现已采用
这种做法。
条件运算符表达式的类型可以是 void、a
结构或联合;大多数其他运营商不处理此类问题
类型。平衡指针和整数之间的类型的规则有,
然而,已经收紧了,因为现在只有常量 0 可以移植
强制为指针。
因此,如果有人想要对结构或联合类型执行算术运算,那么 ?: 应该比 if-else 更方便。我认为这没有明显的好处,但至少这是运营商存在的一些理由。
下一个问题是:
为什么有一个编译器扩展?:
GCC 中的操作数
编译器?
这个问题的答案已经提到了here http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals:
当它变得有用时,是当第一个操作数确实或可能(如果它
是一个宏参数),包含副作用。然后重复
中间的操作数会产生两次副作用。省略
中间操作数使用已经计算出的值,无需
重新计算它会产生不良影响。
因此,这个 GCC 扩展与可读性或语言一致性无关,它只是为了避免不必要的副作用而添加的。
然后尝试回答原来的问题:
为什么GCC的三元扩展不支持赋值?
可能是因为在赋值条件下访问左值通常不会产生任何不需要的副作用。x = x ? : 2;
如果 x 被声明为 a,只会产生不需要的副作用volatile
- 读取易失性变量是一个副作用。所以我能看到的唯一实际用途是x ?:= 2;
是为了防止有人在同一个条件表达式中两次访问同一个易失性变量。
这是一个非常狭窄且价值有限的特征。在某些特殊的嵌入式系统情况下,它可能很有用,在这种情况下,您可以在要求严格的实时系统中读取硬件寄存器……除此之外,我认为它没有任何用处。
除了传统和主观编码风格偏好之外,我也找不到任何官方或规范来源说明 ?: 运算符本身的任何用途。