Я читал, что *
(умножение) имеет более высокую предрасположенность, чем /
(деление). Таким образом, если есть уравнение с *
и /
, то сначала должно состояться *
.Умножение и деление: странный вывод в c
Но я видел программу, вывести что-то странное
#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
float s=10, u=30, t=2, a;
a = 2*(s-u*t)/SQUARE(t);
printf("Result = %f", a);
return 0;
}
При выполнении этого, я думал, что выход будет -25, но на самом деле это было -100.
Когда я искал объяснение это было
Step 2: a = 2*(s-u*t)/SQUARE(t); becomes,
// Here SQUARE(t) is replaced by macro to t*t
=> a = 2 * (10 - 30 * 2)/t * t;
=> a = 2 * (10 - 30 * 2)/2 * 2;
=> a = 2 * (10 - 60)/2 * 2;
=> a = 2 * (-50)/2 * 2 ;
/*till here it's OK*/
/*why it divided -50 by 2 before multiplying 2*2 and -50*2 */
=> a = 2 * (-25) * 2 ;
=> a = (-50) * 2 ;
=> a = -100;
Может ли один объяснить, пожалуйста?
Еще одна ссылка: http://msdn.microsoft.com/en-us/library/126fe14k.aspx – Inisheer
У этого есть много дубликатов, например.g [Странное поведение макрорасширения] (http://stackoverflow.com/questions/15337185/strange-behavior-of-macro-expansion) –