1.&&和||中的短路原则。
当左边的表达式已经确定了整个表达式的结果,那个右边的表达式不会被执行,即如下程序片段输出及执行结果为:
int a=0,b=1;
if(1||a++);
if(0&&b++);
printf("a=%d\nb=%d\n",a,b);
2.为什么下面的代码不对?
int a=1000,b=1000;
long int c=a*b;
因为乘法是用int进行的,而其结果可能会在提升或赋给左边的long int型之前溢出或被截短。
所以应该以long int型进行乘法运算,可以为下面的两种形式:
long int c=(long int)a*b;
或 long int c=(long int )a*(long int)b;
但不能为下面的形式:
long int c=(long int)(a*b);
读者如果不明白c语言中的类型转换规则和时机,可以参考
c语言类型转换
3.为什么如下程序中无论degF取什么值,degC的值总是0?
double degC,degF;
degC=5/9*(degF-32);
printf("degC=%f\n",degC);
如果二元操作符的两个操作数都是整数,则C语言进行整数运算,这与表达式的其余部分的类型无关。如果想进行浮点数运算,可以参考该章问题2,或者改为下式:
degC=5.0/9*(degF-32);
4.如下代码是可以编译运行的,为什么?
int a,b,c,d;
a?b=c:d;
在c语言原来的定义中,=的优先级是低于?:的。读者如果不清楚ANSI/ISOC标准的表达式顺序,可以参考
c语言表达式运算顺序