C 语言(以及 C++)历史上是两种完全不同的编程风格的混合体,可以称为“语句编程”和“表达式编程”。如您所知,每种过程式编程语言通常都支持以下基本结构:测序 and 分枝 (see 结构化编程 https://en.wikipedia.org/wiki/Structured_programming)。这些基本结构以两种形式出现在 C/C++ 语言中:一种用于语句编程,另一种用于表达式编程。
例如,当您用语句编写程序时,您可能会使用由;
。当你想做一些分支时,你可以使用if
声明。您还可以使用循环和其他类型的控制传输语句。
在表达式编程中,您也可以使用相同的构造。这实际上是在哪里,
运算符开始发挥作用。操作员,
无非是 C 中顺序表达式的分隔符,即运算符,
在表达式编程中的作用与;
在语句编程中。表达式编程中的分支是通过?:
运算符,或者通过短路评估属性&&
and ||
运营商。 (表达式编程没有循环。要用递归替换它们,您必须应用语句编程。)
例如下面的代码
a = rand();
++a;
b = rand();
c = a + b / 2;
if (a < c - 5)
d = a;
else
d = b;
这是传统语句编程的一个例子,可以用表达式编程重写为
a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? d = a : d = b;
or as
a = rand(), ++a, b = rand(), c = a + b / 2, d = a < c - 5 ? a : b;
or
d = (a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? a : b);
or
a = rand(), ++a, b = rand(), c = a + b / 2, (a < c - 5 && (d = a, 1)) || (d = b);
不用说,在实践中,语句编程通常会生成更具可读性的 C/C++ 代码,因此我们通常会以经过严格衡量和限制的数量使用表达式编程。但在很多情况下它很方便。可接受与不可接受之间的界限在很大程度上取决于个人喜好以及识别和阅读既定习语的能力。
附加说明:该语言的设计显然是针对语句量身定制的。语句可以自由调用表达式,但表达式不能调用语句(除了调用预定义的函数)。这种情况在 GCC 编译器中以一种相当有趣的方式改变,它支持所谓的“陈述表达式” http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62作为扩展(与标准 C 中的“表达式语句”对称)。 “语句表达式”允许用户直接将基于语句的代码插入到表达式中,就像他们可以将基于表达式的代码插入到标准 C 中的语句中一样。
另一个补充说明:在 C++ 语言中,基于函子的编程发挥着重要作用,这可以看作是“表达式编程”的另一种形式。根据当前 C++ 设计的趋势,在许多情况下它可能比传统的语句编程更可取。