复习C语言

今天突然有感觉复习下C语言了,发现已经好久没有用过C编程了,话说最近都没有编过程序了都,趁现在还有点时间,好好学习下C了。话不多说上题目


请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

分析:要不使用符号比较数的大小,第一个想到的应该是最原始的方法,就是数的二进制表示(第一位为1表示这是一个负数),以及对二进制的操作

步骤:

  1. 得到当前系统的位数:sizeof函数
  2. 将1左移位数减一位得到一个最高位为1的二进制数,如: 0x10000000
  3. 将两数之差和0x10000000相,如果为1,说明差是负数。。。

代码:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int const shift = sizeof(int) * 8 - 1;
#define max(a,b) ((((a)-(b))&(1 << shift))?b:a)
// test
void main()
{
printf("%d", max(23,3));
}

第二种实现方法:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#define MAX(a,b) ((a/b)?a:b)
// test
void main()
{
printf("%d", max(23,3));
}

2014/3/21 22:45:13


输出源文件的标题和目前执行行的行数

分析:掌握LINEFILE这两个宏定义就行了

代码

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
int line = __LINE__;
char* file = __FILE__;
cout << "filename:" << (file) << ",line is " << line << endl;
return 0;
}

2014/3/21 23:06:16


不使用多余变量实现两个数的交换

分析:1)使用^符号,2)使用+/-符号

代码

swap.cview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "vell001.h"
// 使用与符号交换
void swap_1(int* a, int* b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
// 使用加减运算符交换
void swap_2(int* a, int* b){
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
void main(){
int a=1, b=2;
printf("(a=%d, b=%d)\n", a, b);
swap_1(&a, &b);
printf("(a=%d, b=%d)\n", a, b);
swap_2(&a, &b);
printf("(a=%d, b=%d)\n", a, b);
}

2014-03-28 21:21:33


fun((exp1,exp2),(exp3,exp4,exp5))有几个实参?

解释:逗号表达式,它将以逗号为界,从左到右依次计算每个表达式的值,最后返回最右边的表达式的值
答案:两个括号内的就是逗号表达式,所以在fun()里运算后只得到fun(exp2,exp5),也就是两个实参~(≧▽≦)/~啦啦啦

2014/9/5 20:50:19