1.下面这个表达式的类型和值分别是什么?
(float)(25 / 10);
解析:
#include <stdio.h>
#include <stdlib.h>
int main( void ){
printf( "sizeof( (float)(25 / 10) ) = %zd, (float)(25 / 10) = %f, "
"sizeof( float ) = %zd\n", sizeof( (float)(25 / 10) ), (float)(25 / 10), sizeof( float ) );
return EXIT_SUCCESS;
}
输出:
2.下面这个程序的结果是什么?
int func( void ){
static int counter = 1;
return ++counter;
}
int main( void ){
int answer;
answer = func() - func() * func();
printf( "%d\n", answer );
return EXIT_SUCCESS;
}
解析:
这是一个狡猾的问题。比较明显的回答是-10(2 - 3 * 4),但实际上它因编译器而异。乘法运算必须在加法运算之前完成,但并无规则规定函数调用完成的顺序。因此,下面几个答案都是正确的:
-10 (2 - 3 * 4) or (2 - 4 * 3)
-5 (3 - 2 * 4) or (3 - 4 * 2)
-2 (4 - 2 * 3) or (4 - 3 * 2)
下面是DEV-C++编译器的答案:
#include <stdio.h>
#include <stdlib.h>
int func( void ){
static int counter = 1;
return ++counter;
}
int main( void ){
int answer;
answer = func() - func() * func();
printf( "%d\n", answer );
return EXIT_SUCCESS;
}
输出:
3.位操作符和移位操作符可以用在什么地方?
解析:
位操作符可以用在让某一位置为1,或者让某一位为0。
移位操作符可以用在进行更快的乘除法,两者结合起来可以用来查看值在内存中的表现形式。
4.条件操作符在运行时比较时较之if语句是更快还是更慢?试着比较下面两个代码段。
if( a > 3 ){
i = b + 1;
} else{
i = c * 5;
}
i = a > 3 ? b + 1 : c * 5;
解析:
不,它们都执行相同的任务。如果你比较吹毛求疵,使用if的哪个方案看上去稍微臃肿一些,因为它具有两条存储到i的指令。但是,它们之间只有一条指令才会执行,所以在速度上并无差别。
#include <stdio.h>
#include <stdlib.h>
int main( void ){
int a = 5;
int b = 6;
int c = 2;
int i;
if( a > 3 ){
i = b + 1;
} else{
i = c * 5;
}
printf( "1:use if statement:i = %d, a = %d, b = %d, c = %d\n", i, a, b, c );
i = a > 3 ? b + 1 : c * 5;
printf( "2:use ?: operator:i = %d, a = %d, b = %d, c = %d\n", i, a, b, c );
return EXIT_SUCCESS;
}
输出:
5.可以被4整除的年份是闰年,但是其中能够被100整除的年份又不是闰年。但是,这其中能够被400整除的年份又是闰年。请写一条赋值语句,实现如下功能:如果变量year的值是闰年,把变量leap_year设置为真;如果year的值不是闰年,把leap_year设置为假。
解析:
#include <stdio.h>
#include <stdlib.h>
int main( void ){
int leap_year = 0; /*第1种方法需要假定其不是闰年*/
int year;
year = 2900;
if( year % 4 == 0 ){
leap_year = 1;
}
if( year % 4 == 0 && year % 100 == 0 ){
leap_year = 0;
}
if( year % 4 == 0 && year % 100 != 0 ){
leap_year = 1;
}
if( year % 4 == 0 && year % 100 == 0 && year % 400 == 0 ){
leap_year = 1;
}
printf( "method01: %d year is %s year.\n", year, leap_year == 1 ? "leap" : " not leap " );
/* 更优秀的解法,即最先考虑最特殊的情况 */
if( year % 400 == 0 ){
leap_year = 1;
} else if( year % 100 == 0 ){
leap_year = 0;
} else if( year % 4 == 0 ){
leap_year = 1;
} else{
leap_year = 0;
}
printf( "method02: %d year is %s year.\n", year, leap_year == 1 ? "leap" : " not leap " );
return EXIT_SUCCESS;
}
输出:
6.哪些操作符具有副作用?它们具有什么副作用?
解析:
()操作符并无任何副作用,但它所调用的函数可能有副作用。
操作符 副作用
++,-- 不论是前缀还是后缀形式,这些操作符都会修改它们的操作数
= 包括所有其它的复合赋值符:它们都修改作为左值的左操作数
#include <stdio.h>
#include <stdlib.h>
int main( void ){
int a = 1, b = 1;
int prefix_a;
int b_post;
printf( "a