一、找大小
要求:变量a和b,不用“if”、“?:”、“switch”或其他判断语句找出两个数中间比较大的。
//方案一:简单实用
int getMax1(int a,int b){
return ((a+b)+abs(a-b))/2;
}
//方案二:有点意思
int getMax2(int a,int b){
int str[2]={a,b};
int c = a < b;
return str[c];
}
//方案三:装逼可用
int getMax3(int a,int b)
{
int c=-((b-a)>>31);//由系统决定,右移补符号位则要有负号,补0则不需要
return c*a+(1-c)*b;
}
二、交换变量
要求:不用中间变量实现a、b交换。
//方案一:
void swap1(int *a,int *b){ //可能发生越界
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
swap1(&a,&b); printf("a=%d,b=%d\n",a,b);
//方案二
void swap2(int *a,int *b){ //没有副作用
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
//方案三
void swap3(int *a,int *b){ //b不能为0
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
}
//方案四
void swap4(int *a,int *b){ //想法不错
*a = *a + *b-(*b=*a);
//*a=(*a)*(*b)/(*b=*a);
}
三、函数参数可变
#include <stdio.h>
#include <stdarg.h> //必须使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏
// 函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数必须是 int,代表了要传递的可变参数的总数
double average(int num,...)
{
va_list valist; //在函数定义中创建一个 va_list 类型变量 用于获得可变参数具体值,该类型是在 stdarg.h 头文件中定义
double sum = 0.0;
int i;
va_start(valist, num); //使用 int参数个数 和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义
for (i = 0; i < num; i++)
{
sum += va_arg(valist, int); // 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项
}
va_end(valist); // 使用宏 va_end 来清理赋予 va_list 变量的内存
return sum/num;
}
int main()
{
printf("Average of 1, 2, 3, 4, 5, 6, 7 = %f\n", average(7, 1,2,3,4,5,6,7));
printf("Average of 10 , 100 ,1000 = %f\n", average(3, 10,100,1000));
}
四、嵌套注释和代码剪裁
#if 0 … #endif的作用跟/*…*/的作用是一样的,就是注释.
#include<stdio.h>
#define T 1
int main()
{
int a=11;
//这是一个外层注释
#if T
a=10;
#endif
//a++;
printf("a=%d\n",a);
return 0;
}
结果:a=10
待续…