您的位置:首页 > 其它

关于今天小考核的问题的总结

2017-11-20 23:38 309 查看
1.常见的运算符里,从右往左的有:=(赋值)、 ++、 --、 ?:、  *、 &、 !、 sizeof等。

顺带解释下从右往左的意思:主要引用自 https://zhidao.baidu.com/question/561922965.html
一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。

即,相同优先级的运算符连续出现时,应该从右往左算还是从左往右算。

例:

 int a,b=1,c=2; a=b=c;

我们发现,这个表达式只有赋值符,这样优先级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.

int a=1, b=3, c=2, d;

d = a>b ? a : c>b ? c : b;

// 根据从右到左的结合顺序,则该表达式等价于d = (a>b ? a : (c>b ? c : b));

// 计算过程:

// 1、先算a>b,结果为0;

// 2、再算(c>b ? c : b),之后算c>b,结果为0,

// 3、所以最后结果为b的值,也即等于3

// 如果是从左到右的结合顺序,那么该表达式等价于d =((a>b ? a : c>b) ? c : b);

//计算过程:

// 1、先算a>b,结果为0;

// 2、再算c>b,结果为0;

// 3、所以d=b,结果为b的值,也即等于3

虽然计算结果相同,但是计算的顺序是完全不同的,正确的应该是从右往左。

还有经典的:while (*des++ = *src++);

*和++优先级相同,但他们都是从右往左的结合性,即他俩连续出现时,应该从右往左看。即,是先 ++,然后 * 。(虽然是先++,但因为此处的 ++是后置++,所以结果还是先解引用的,然后才真正的加1的,但对于计算而言,它处理的顺序确实是先运算后置的++,然后才运算的 *(解引用))

2.浮点数不能进行位操作,会改变第一位的符号位。

3.switch语句的表达式,不能是浮点数,字符串,可以是bool类型、整型等。浮点数不行的原因:浮点数有精度问题,switch内置的判断相等语句就会出错。字符串不行的原因:字符串都是以指针的形式表示,指针的相等不能代表字符串的相等,字符串的比较应该用strcmp函数。

4. 如:4>3,结果为1(并不是非0值,就是1);4<3,结果为0。if(express),express只要是非0(任意不是0的结果都可以,1,5,32)就执行下面的语句。

5.if(express1 || express2),逻辑或运算符||,是从左往右看的,意思是只要express1为真了,就直接得到结论了,不再去执行express2了。

6.bool flg = true;

   for(int i = 0; i < n; i++)                           

    {if(n % i == 0)                                       

      {if(flg)

        { flg = false;                                     

         .....                                                 

         }

         else

         {......

          }

       }

    }

如上,跟#ifndef...#define... ...#endif,一样,如果遇到一些首次只允许出现一次的情况,可以定义一个状态常量(flg),bool类型,首先把flg置为ture,然后开始执行,判断flg是不是真,是真,就把它置为false,然后执行首次语句,如果是假,就跳过首次,执行其他语句。

7.bool类型的值只有true和false,true的值为1,false的值为0. 如果:bool a; a = 5; 则a的值为1(true),任意非0值赋值给bool变量,值为1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: