c/c++中一些巧妙的方法

一、找大小

要求:变量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

待续…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值