6 考察了错误的宏替换和运算符的优先级。 算术运算符(+ - * /)和关系运算符(> >= < <=)哪个优先级高?
MAX(a+b,c+d) = a+b>c+d ? 2*a+b : 2*c+d
算术运算符的优先级高于关系运算符,所以可以化简为 3>7 ? 4: 10 = 10
正确的写法应该如下所示:
1 2 3 4 5 6 7 8 | #include <stdio.h> #define MAX(A,B) A>B?2*A:2*B void main() { int a=1,b=2,c=3,d=4,t; t=MAX(a+b,c+d); printf("%d\n",t); } |
由于宏很容易出错,所以建议使用函数来替换宏。如果一定要使用宏,千万注意别少了括号。在二级C考试中,常考的就是不正确的宏的使用。
7 本题是交换两个整数的另外一种方法,你依次做就可以
1 2 3 4 5 6 7 8 9 | #include <stdio.h> void main() { int a=1,b=2; a+=b; b=a-b; a-=b; printf("%d,%d\n",a,b); } |
8 正确的交换两个数的函数应该如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> void swap(int a,int b) { int t; if(a>b)t=a,a=b,b=t; } void main() { int x=13,y=11,z=12; if(x>y)swap(x,y); if(x>z)swap(x,z); if(y>z)swap(y,z); printf("%d\t%d\t%d\n",x,y,z); } |
本题中的写法,也就是不使用指针,是无法使得实参发生改变,也就无法完成两数的交换。第10~12行代码是不会使 x, y, z 发生变化的
9 本题考察了静态变量,以及变量 x 的作用域。
第 1 次调用函数 f 时, 静态变量 x 是其初始值 2;第 2 次调用函数 f 时,静态变量 x 是4,这是静态变量的概念。
另外,在函数中,出现了两个x, return x+y 的 x 使用的是 函数调用时传入的 x
第一次调用 f(a, 3) = f(3, 3) = { static x = 2 -> 4, y =4 } = return x+y = 3+4 = 7
第二次调用 f(a, 2) = f(3, 2) = { static x = 4, y =5 } = return x+y = 3+5 = 8
10 简单的递归
这个递归很简单,只用了一次。
11 杨辉三角形。如果你对杨辉三角形很了解,本题就 So Easy
12 很简单的 fun 函数,只不过是使用指针来实现。函数的功能是将奇数位置的字符进行反转。你可以先熟悉将整个字符串进行反转的函数。
13 题目很简单,细心完成就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int g(int x,int y) { return x+y; } int f(int x,int y) { { static int x=2; if(y>2) { x=x*x; y=x; } else y=x+1; } return x+y; } void main() { int a=3; printf("%d\n",g(a,2)); printf("%d\n",f(a,3)); printf("%d\n",f(a,2)); } |
【答案】
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> void fun(int m,int n) { if(m>=n) printf("%d",m); else fun(m+1,n); printf("%d",m); } void main() { fun(1,2); } |