greedy algorithm from left to right to identify operators.
if space is inserted, it doesn't seem to affect the grouping of operators.
parentheses can change grouping of operators.
a+++b => a++ +b.
++i+++i+++i => ++i++ +i + ++i. //see following examples
a+++++b => a++ ++ +b.
Examples:
int o, p, q;
o = 0;
p = (++o)+(++o)+(++o);
printf("o1: %d\n", o); //3.
printf("01: %d\n", p); //7. (++o)+(++o)+(++o) => ++o+++o+++o => 1+++o+++o => 2+o+++o => 4+++o => 4+3 = 7.
o=0;
p = (++o) + (++o) + (++o); //spaces are inserted. OR: p = ++o + ++o + ++o;
printf("o2: %d\n", o); //3.
printf("02: %d\n", p); //7. (++o) + (++o) + (++o) => 1+ (++o) + (++o) => 1 + 2 + (++o) => 1+ 2+ 3 = 6. Wrong!!!
//p = ++o+++o+++o; //error. lvalue required as increment operand.
//printf("03: %d\n", p);
o=0;
p=(o++,o++,o++);
printf("o4: %d\n", o); //3.
printf("04: %d\n", p); //2. (o++,o++,o++) => (0, ,o++,o++) => (0,1,o++) => (0,1,2), p=2, o=3.
o=0;
p=(o++)+(o++)+(o++);
printf("o5: %d\n", o); //3.
printf("05: %d\n", p); //0. why???
o=0;
p=(o++) + (o++) + (o++); //spaces are inserted.
printf("o6: %d\n", o); //3.
printf("06: %d\n", p); //0. why???
o=0;
p=0;
q = o+++p;
printf("o7: %d\n", o); //1.
printf("p7: %d\n", p); //0.
printf("07: %d\n", q); //0. why???
o=0;
p=0;
q = o+(++p);
printf("o8: %d\n", o); //0.
printf("p8: %d\n", p); //1.
printf("08: %d\n", q); //1. why not 0???
o=0;
p=0;
q = o+ (++p); //spaces are inserted.
printf("o9: %d\n", o); //0.
printf("p9: %d\n", p); //1.
printf("09: %d\n", q); //1. why not 0???
o=0;
p=0;
//q = o+++++p; //error. //error. lvalue required as increment operand.
//printf("10: %d\n", q);
q = (o++)+(++p);
printf("o11: %d\n", o); //1.
printf("p11: %d\n", p); //1.
printf("11: %d\n", q); //1. why not 0???
o=0;
p=0;
q = (o++) + (++p); //spaces are inserted.
printf("o12: %d\n", o); //1.
printf("p12: %d\n", p); //1.
printf("12: %d\n", q); //1. why not 0??? (o++) + (++p) => 0 + (++p) => 0 + 1 => 1.
o=0;
p=0;
q = o+++(++p);
printf("o13: %d\n", o); //1
printf("p13: %d\n", p); //1
printf("13: %d\n", q); //1. why not 0???
*****/ and %*****
q = a/b;
r = a%b;
我们希望:
- 最重要的一点,我们希望q*b + r == a,因为这是定义余数的关系。
- 如果改变a的正负号,我们希望q的符号也随之改变,但q的绝对值不会变。
- 当b>0时,我们希望保证r>=0 且 r<b。
C语言的定义只保证性质1,以及当a>=0且b>0时,保证|r| < |b|以及r>=0。
int o, p, q;
o=2; p=-2;
q=o/p;
printf("%d\n", q); //-1
q=o%p;
printf("%d\n",q); //0
*****运算符优先级*****