以下程序的运行结果是
//1.
int fun(int a, int b)
{
if (a>b)
{
return(a + b);
}
else
{
return(a - b);
}
}
int main()
{
int x = 3, y = 8, z = 6, r;
r = fun(fun(x, y), 2 * z);
printf("%d\n", r); \\-17
system("pause");
return 0;
}
//2.
int f(int a)
{
int b = 0;
static int c = 3;
a = c++; b++;
return (a);
}
int main()
{
int a = 2, i, k;
for (i = 0; i < 2; i++)
{
k = f(a++);//a++的值为2
}
printf("%d\n", k);//4
system("pause");
return 0;
}
//3.
int x = 3;
void inc()
{
static int x= 1;
x *= (x + 1);
printf("%d\n", x);//2 6
return ;
}
int main()
{
int i;
for (i = 1; i < x; i++)
{
inc();
}
system("pause");
return 0;
}
理解清楚该题需要了解两个知识点
(1)static变量只进行一次初始化;
(2)全局变量与局部变量:当局部变量与全局变量同名时,局部变量“屏蔽”全局变量,注意这里说的是“屏蔽”而非修改,其实二者虽然同名但二者系两个不同的变量。
int x=3;//全局变量
inc()
{static int x=1;//inc函数中的局部变量,与上面的全局变量不是一码事儿
x*=x+1; //此处计算所用到的变量x系inc函数的局部变量,而非第一行所定义的全局变量
printf("%d\n",x);
}
int main()
{int i;
for(i=1;i<x;i++) //此处所用到的x是全局变量的值
inc();
}
该程序的执行过程为:
(1)i = 1时,i < x (x的值为3,全局变量的数值)成立,执行inc()函数
static int x = 1;//初始化静态局部变量x的值为1(只进行这一次初始化,下次在执行该函数时不再初始化)
x*=x+1 ; //x = 2
输出inc函数中局部变量x的值为2;
(2)i = 2时,i < x(x的值为3,全局变量的数值)成立,再次执行inc()函数
x*=x+1 ;//x = 2*(2 + 1)
输出x=6.
(3)i = 3,i < x(x的值为3,全局变量的数值)不成立,main函数中循环执行结束。
4. 一个8位的二进制整数,若采用补码表示,且由3个“1”和5个“0”组成,则最小值为-125.
分析:正数的补码与原码、反码相同,负数的补码等于其反码加1,且无论是反码还是补码,其最高位都只用来表示数的正负,所以补码的最高位为1;由于补码和原码的关系,所求的最小数的补码应该最大,5个0和3个1组成的最大负数补码应该是 10000011,其原码为11111101,即-125。
5. int a=4, 则对于表达式++(a++)是错误的。
a++的结果是4,然后进行++4是不对的,++运算只是针对于变量的,不能对常量来进行++运算。
6.已知x >= y and y >= z 为真,那么x > z or y ==z 值为真
因为x>=z,是成立的,那么分两种情况,1.x>z,那or前面的条件成立,条件为真,2.x>z不成立,即得出x==z,此时y==z成立,条件依然为真。
7.式子 7*15=133成立,则用的是8进制
设 k进制,则
7(k+5) = k^2+3k+3,
解得 k = 8,
也即 8 进制 。(化为十进制是 7*13 = 91)