b!=2
是判断b是否为2。是,结果为0,不是,结果为1。
c--!=3
是判断c是否为3。是,结果为0,不是,结果为1。
然后c自减1.
整体看((b!=2)||(c--!=3))
||
是或运算符,两边只要有一个是非零,结果就是1.
如果前面是非零,则系统不会再去处理后面部分,这样的话,c值不变。
int
b=2;
(3||b)即3与b进行
“或”
运算,(3||2)为真,即(3||b)的结果为1;
算术运算符优先级高于移位运算符,所以先进行算术运算,即b<<(2/1);
最后b左移2位,b=2,二进制表示为0010,左移2位,则为1000,即为十进制的8。
你的写法有问题:
如果这样写的结果为:
int b;
b=b<<2/(3||b);
C语言运算符优先级详细列表请参看:http://www.slyar.com/blog/c-operator-priority.html
从此表可以看出:/运算符比左移运算符<<级别高。而左移运算符<<比逻辑或||运算符级别高,但此处逻辑或运算符被小括号()扩起来了,故该表达式的详解为:
3||b:由于3为非零值故该表示结果为真,即结果为1
由于除法运算级别高,故先执行除法,即2/1结果为2.
然后执行左移运算:将b的值左移2位,十进制2的二进制格式为0010,左移两位为1000,故结果为8.
int b=2;
(3||b)即3与b进行 “或” 运算,(3||2)为真,即(3||b)的结果为1;
算术运算符优先级高于移位运算符,所以先进行算术运算,即b<<(2/1);
最后b左移2位,b=2,二进制表示为0010,左移2位,则为1000,即为十进制的8。