利用 操作符特性 代替if判断语句

参考:http://blog.csdn.net/speedme/article/details/22916181

1.&&的判断特性

#include <stdio.h>

int sumf(int i)
{
    int sum = 0;
#if 0
    i && (sum = i+ sumf(i-1));
#else
    if(i!=0){
        sum = i+ sumf(i-1);
    }
#endif
    return sum;
}

int main()
{
    printf("sum(%d)=%d\n",4,sumf(4));
    printf("aaaaaaaaaaaa\n");
}

用gcc编译,看起来if判断语句效率还高一点。

sumf:// if(i!=0){ sum = i+ sumf(i-1);    }
    pushl    %ebp
    movl    %esp, %ebp
    subl    $40, %esp
    movl    $0, -12(%ebp)
    cmpl    $0, 8(%ebp)
    je    .L2
    movl    8(%ebp), %eax
    subl    $1, %eax
    movl    %eax, (%esp)
    call    sumf
    addl    8(%ebp), %eax
    movl    %eax, -12(%ebp)
.L2:
    movl    -12(%ebp), %eax
    leave
    ret
sumf://i && (sum = i+ sumf(i-1));
    pushl    %ebp
    movl    %esp, %ebp
    subl    $40, %esp
    movl    $0, -12(%ebp)
    cmpl    $0, 8(%ebp)
    je    .L3
    movl    8(%ebp), %eax
    subl    $1, %eax
    movl    %eax, (%esp)
    call    sumf
    addl    8(%ebp), %eax
    movl    %eax, -12(%ebp)
    cmpl    $0, -12(%ebp)
.L3:
    movl    -12(%ebp), %eax
    leave
    ret

2.另类的迭代法:::::(!的判断特性这个比较实用一点)

#include <stdio.h>
typedef unsigned int (*fun)(unsigned int);

unsigned int Solution3_Teminator(unsigned int n)
{
    return 0;
}

unsigned int Sum_Solution3(unsigned int n)
{
    static fun f[2] = {Solution3_Teminator, Sum_Solution3};
    return n + f[!!n](n - 1); //注意此处
}

int sumf(int i)
{
    int sum = 0;
#if 0
    i && (sum = i+ sumf(i-1));
#else
    if(i!=0){
        sum = i+ sumf(i-1);
    }
#endif
    return sum;
}

int main()
{
    printf("Sum_Solution3(%d)=%d\n",4,Sum_Solution3(4));
    printf("sum(%d)=%d\n",4,sumf(4));
    printf("aaaaaaaaaaaa\n");
}
时间: 2024-10-01 04:42:41

利用 操作符特性 代替if判断语句的相关文章

续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,

一. Vim续写 ?1.命令扩展模式的位置定界 ??起始位置 cmd 终止位置???Cmd:????y复制????d删除????Gu变大写????gu变小写??例如:0y$命令意味着:????0 先到行头????Y 从这里开始拷贝????$ 拷贝到本行行尾最后一个字符????Ye 从当前位置拷贝到本单词的最后一个字符 ?2.扩展命令模式:地址定界 ? ?# 具体第#行,? ?#1,#2 从开头数第#1行到第#2行? ?#1,+#2 从开头数的第#1行到从第#1行开始数的第#2行? ? ?例:2,

python基础:循环语句和判断语句

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. python语句块和缩进 缩进是Python语法的一部分:在python语句中,空格是用来区分块的,每一块的语句,缩进量(空格)应该是相同的 Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字: 增加缩进表示语句块的开始,而减少缩进则表示语句块的退出. 在Python中,冒号(:)用来标识语

linux-shell脚本编程-变量-算术表达式-判断语句-if分支语句

bash工作特性:    1.支持命令历史.命令补全    2.支持管道.重定向    3.支持命令别名    4.支持命令行编辑    5.支持命令行展开     6.支持文件名通配    7.支持使用变量    8.支持编程命令编辑:光标跳转:ctrl+a:跳到命令行首  home            ctrl+e:跳到命令行尾  end            ctrl+u:删除光标至命令行首的内容            ctrl+k:删除光标至命令行尾的内容             ct

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句 一:实验环境 1):虚拟机 2):linux系统 二:实验目标 1): shell 基本语法 2):变量 3):表达式 4):判断语句 5): if表达式 三:实验脚本 第一块 一个简单的shell脚本程序 [[email protected] ~]# mkdir test [[email protected] test]# vim example1.sh #!/bin/bash #This is to show wha

C# if判断语句执行顺序

DataTable dt = null; if (dt != null && dt.Rows.Count > 0)//不报错,因为先执行dt != null 成立时才执行dt.Rows.Count > 0 { } if (dt.Rows.Count > 0 && dt != null)//报dt null,因为先执行dt.Rows.Count > 0,但此时dt = null. { } //得出结果:if判断语句,多个条件时,执行顺序是从左到右依次判

mvc4 利用filters特性来 实现自己的权限验证 之二

刚开始摸索C# MVC,也只是按图索骥,对C#的特性不是很懂,耐心看完相关文章,对特性的使用有了进一步理解. 1.特性类的命名规范:特性也是一个类,必须继承于System.Attribute类,命名规范为“类名”+Attribute.不管是直接还是间接继承,都会成为一个特性类,特性类的声明定义了一种可以放置在声明之上新的特性. 2.特性的使用:[特性类名(不需要后缀Attribute)(公共属性=值, 公共属性=值...)]放置于类.方法.字段.属性.结构体...前修饰. 如: //在Perso

如何利用jquery.1.9版本判断浏览器的版本类型

如何利用jquery.1.9版本判断浏览器的版本类型:在jquery.1.9以前的版本,可以使用$.browser很轻松的判断浏览器的类型和版本,但是在1.9中和以后的版本中,$.browser已经被删除,下面就介绍一下如何实现此功能,希望能够给需要的朋友带来帮助.一.自定义代码: $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase()); $.browser.webkit = /webkit/.test(navi

刚开始python的小强---if判断语句

判断: 1.单分支判断语句 if 条件: 内容1 内容2 else: 内容3 内容4 实例: 1 if 1 == 1: 2 print("yes") 3 else: 4 print("no") 2.多分支判断语句 if 条件: 内容1 内容2 elif 条件 内容3 elif 条件 内容4 else: 内容5 实例: 1 inp = input(">>>") 2 if inp == "1": 3 print(

sas条件判断语句

if语句<可执行语句> data b; set sashelp.class; if _n_ le 4; *如果if为真,则继续执行if后面的语句,最后输出满足if的条件的观测,如果if为假则立刻返回到data步开头继续执行下一条set语句; y = 'now'; /* y = 'now'; if _n_ le 4;也能得出同样的结果,但是效率相对来说较低,因为要重复执行y的赋值语句 */ run; if的另外两种格式if x=3 then y=4; 对于要表达的只有一条数据就用thenif x