繁体   English   中英

C中的表达式评估顺序

[英]Order of expression evaluation in C

如果我有以下表达式:

c = (a) * (b)

C90标准对子表达式'a'和'b'的顺序评估有什么看法?

由于乘法运算符不是序列点,因此没有指定的顺序。 序列点包括逗号运算符,完整表达式的结束和函数调用。 因此, (a)(b)的评估顺序取决于编译器实现。 因此,您不应该尝试在(a)中做一些有希望在(b)中看到的副作用以生成有效结果的事情。

例如:

int a=5;
int b = (a++) * (a++); //<== Don't do this!!

如果您想要C的序列点的完整列表,可以在这里查看更全面的参考

在C90中未指定*二元运算符的操作数的评估顺序。

以下是C90标准的相关段落(关于C90的问题):

(C90,6.3)“除非语法指示或稍后指定(对于函数调用运算符(),&&,||,?:和逗号运算符)。子表达式的计算顺序和顺序发生的副作用都是未指明的“

对于*运算符,如果我们以副作用操作数为例:

c =  f() * g();

实现可以先调用f() first或g()调用:

a = f();
b = g();
c = a * b;

要么

a = g();
b = f();
c = a * b;

两者都是有效的翻译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM