fun(char *w,int n)
{char t,*s1,*s2;
s1=w;s2=w+n-1;
while(s16) ? puts("> 6") : puts("<= 6");
}
输出>6
因为表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
4. 说明以下两个语句的作用,哪个更好?为什么?
#define PS struct po_s*
typedef struct po_s* PS_t;
这两个语句是将PS 和 PS_t 作为一个指向结构po_s指针。typedef更好。
因为如下代码
PS p1, p2;
PS_t p3, p4;
p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。
5. 下面两段代码一样吗?为什么?
int square(volatile int *ptr)
{
int a, b;
a = *ptr;
b = *ptr;
return a * b;
}
int square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。第一段段代码返回的可能不是你所期望的平方值。
#include
static jmp_buf buf;
main(b)
{
volatile int b;
b =3;
if(setjmp(buf)!=0)
{
printf("%d ", b);
exit(0);
}
b=5;
longjmp(buf , 1);
}
请问, 这段程序的输出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是
考查多维数组与指针
void foo(int [][3]);
main()
{
int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};
foo(a);
printf("%d" , a[2][1]);
}
void foo(int b[][3])
{
++ b;
b[1][1] =9;
}
这段程序的输出是: b
(a) 8
(b) 9
(c) 7
(d)以上均不对
考查自减操作(--)
void e(int );
main()
{
int a;
a=3;
e(a);
}
void e(int n)
{
if(n>0)
{
e(--n);
printf("%d", n);
e(--n);
}
}
void f(char**);
main()
{
char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" };
f( argv );
}
void f( char **p )
{
char* t;
t= (p+= sizeof(int))[-1];
printf( "%s" , t);
}
这段程序的输出是: b
(a) ab
(b) cd
(c) ef
(d) gh