为什么“if”不是C中的表达式

时间:2013-02-22 13:17:22

标签: c if-statement compiler-construction

C中'if'语句不是表达式的原因是什么?为什么三元运算符被添加到C而不是'if'表达式?

是否有技术原因或仅仅是一个历史决定?

Ed:为了让事情更清楚,我想象一个'if'这样的表达式:如果没有使用它的结果,它可能就像一个语句,但如果某些东西需要结果,它必须有同一返回类型的else分支。

现在我看到结果是模棱两可的:实际上,它是表达式和​​语句的奇怪混合,所以清晰的分离更好。

2 个答案:

答案 0 :(得分:9)

我想说因为C是一种命令式语言,建模机器,而不是数学,所有函数都有价值。

if-expression需要一个强制性的else-expression(或强制异常抛出),它不适合于面向性能和机器的编程语言,在这种语言中你只需支付你使用的内容。


(旁注) 标准可以声明如果if-expression不在赋值的右侧,则else部分变为可选。但是,这会使C语法更复杂。

第二个限制:在表达式中,您只能使用其他表达式。你不能举例:

int i = if (foo) { for (int x=4; x; --x) {}; 42 } else bar;

虽然原则上可行,但我认为这会带走一些C的美妙,简约的语法;你必须扩展琐碎表达式与代码块的规则,你需要在解析时记住更多的上下文,等等。 (/旁注)


C ++中的三元运算符(注意: C ++ )完全相同:需要else-part,因为它是表达式或抛出异常:

int foo = frob ? bar : throw "crap";

那件事基本上是一个if-else- 表达式;对于将?:替换为if/else的语言,Python就是一个示例:

foo = frob if bar else 42

你所描述的实际上是两件事:if-statements和if-expression。两者都在C;两者都有不同的特点。并且,不知何故,你问为什么不是 if-statements if-expressions 表达式

答案 1 :(得分:0)

使用类似的东西来定义if:

"if" <whitespace> "(" <whitespace> <expression> <whitespace> ")" <whitespace> <statement>

如果满足条件,它将接受声明。如果它是一个表达式,它将需要返回一些东西,因此它只能执行其他表达式而不是一般语句。事实上,?:只能执行条件表达式而不能执行语句。