C语言之各种符号

*****comment*****

/**/这种习惯的注释不能嵌套。
编译器会将注释部分剔除,但不是简单的删除,而是用空格代替原来的注释,比如int/*...*/i是合法的,但in/*...*/t i不合法。
y = x/*p编译出错,编译器把/*当成一段注释的开始。y = x/ *p或y = x/(*p)正确。

*****back slash*****
反斜杠'\'表示断行,但反斜杠之后不能有空格,反斜杠的下一行之前页不能有空格。

*****single quote和double quote*****
'A'字符常量A,占一个字节
“A”字符串常量A,占两个字节

*****shift*****
'>>'和'<<': 左边是运算数,右边是移动的位数(不能大于数据长度,不能小于0)。
左移时,高位丢弃,低位补0。右移时,操作数为正数时,最高位补0,低位丢弃;操作数为负数时,最高位补0或1(由编译系统决定,一般是1),低位丢弃。

*****comma*****
v = x, y, z; //start from left to right, compute one by one. and v has the value of z.

*****++ and --*****

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;

我们希望:

  1. 最重要的一点,我们希望q*b + r == a,因为这是定义余数的关系。
  2. 如果改变a的正负号,我们希望q的符号也随之改变,但q的绝对值不会变。
  3. 当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

 

*****运算符优先级*****

易出错的优先级
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值