2016-07-28 40 views
-1

例如:如何检查C中首先评估哪个表达式?

5*3 + 9*6 

据我所知,根据类型在一些5*3编译器被首先,而在其他的编译器9*6首先计算评价。

是否有在C语言的函数或技术,可以检查哪个先求?

+0

对于MSVC https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx –

+0

我也发现了这一点:http://stackoverflow.com/questions/16530140/precedence-and-associativity -of运营商,在-C/16530162#16530162这http://stackoverflow.com/questions/7112282/order-of-evaluation-of-operands –

+3

因为有没有副作用,是什么意思它有在这里“评估第一”的一部分表达?如果在组合子表达式时遵守优先规则,则术语的评估顺序不是可观察到的现象(除非用调试器加入生成的程序集,但即使在那里情况并非如此清晰)。 –

回答

0

是否有在C语言的函数或技术,可以检查哪个先求?

您可以定义一个函数来将数字相乘并添加代码以产生一些输出。

int multiply(int n1, int n2) 
{ 
    printf("Computing %d*%d\n", n1, n2); 
    return n1*n2; 
} 

并使用该函数来执行乘法而不是使用乘法运算符。

multiply(5, 3) + multiply(9, 6); 
+0

啊,但你怎么能保证编译器将不会内联整个事情和之前(或之后)重新排序打印的乘法? –

+1

@MatteoItalia,这将是非法的,因为它会改变程序的可观察行为。 –

+1

执行算术时没有任何可观察的内容,除非涉及对'volatile'变量的写入。顺便说一下,在这种情况下,不需要实际的运行时乘法,任何值得的任何优化器都会将结果直接放入可执行文件中。 –