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。