最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用C語言模仿Python函數(shù)的實例

 更新時間:2017年05月14日 10:07:54   投稿:jingxian  
下面小編就為大家?guī)硪黄肅語言模仿Python函數(shù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

首先得說明一點,C 語言不是函數(shù)式編程語言,要想進行完全的函數(shù)式編程,還得先寫個虛擬機,然后再寫個解釋器才行(相當于 CPython )。

下面我們提供一個例子,說明 C 語言函數(shù)可以“適度地模仿” Python 函數(shù)。

我們有如下的 Python 程序:

def line_conf(a, b):
  def line(x):
    return a*x + b
  return line

line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))

 我們在C程序中適度地模擬其中的line_conf函數(shù):

/* MIT License

Copyright (c) 2017 Yuandong-Chen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. */

///////////////////////////////////////////////////////////////////////////////

// Note: The C program is almost equivalent to the Python program as follows:
// def line_conf(a, b):
//   def line(x):
//     return a*x + b
//   return line
//
// line1 = line_conf(1, 1)
// line2 = line_conf(4, 5)
// print(line1(5), line2(5))

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdarg.h>

typedef int Func();

Func *line_conf(int x, int y,...)
{ 
  va_list ap; 
  va_start(ap, y);

  asm volatile(
    "push %%eax\n\t"
    "subl $40, %%esp\n\t"
    "movl 8(%%ebp), %%eax\n\t"
    "movl %%eax, -36(%%ebp)\n\t"
    "movl 12(%%ebp), %%eax\n\t"
    "movl %%eax, -40(%%ebp)\n\t"
    "addl $40, %%esp\n\t"
    "pop %%eax\n\t"
    :::"memory"
    );

if(va_arg(ap,int) == 1){

LINE:

  asm volatile(
    "push %%ebp\n\t"
    "movl %%esp, %%ebp\n\t"
    "movl 8(%%ebp), %%eax\n\t"
    "imul -36(%%ebp), %%eax\n\t"
    "addl -40(%%ebp), %%eax\n\t"
    "movl %%ebp, %%esp\n\t"
    "pop %%ebp\n\t"
    "ret\n\t"
    :::"memory","%eax"
    );
}  
__END: 
  va_end(ap);
  return (Func *)(&&LINE);
}

int main(int argc, const char *argv[]){ 
  printf("====TEST START====\n");
  printf("34*234+6 ?= %d\n",line_conf(34,6)(234));
  printf("1*3+2 ?= %d; 324*65+3 ?= %d; 13*66+2 ?= %d\n",line_conf(1,2)(3),line_conf(324,3)(65),line_conf(13,2)(66));

  int fd = line_conf(1,6)(4);
  Func *fun = line_conf(3,3);
  int a = 1; // Limited point
  printf("3*3+3 ?= %d; 1*4+6 ?= %d\n",fun(3),fd);
  printf("====TEST END====\n");
  return 0; 
}

// Compile it by the following command:
// gcc -m32 -O0 -fno-stack-protector CFunctional.c; ./a.out
// The terminal output should looks like:
// ====TEST START====
// 34*234+6 ?= 7962
// 1*3+2 ?= 5; 324*65+3 ?= 21063; 13*66+2 ?= 860
// 3*3+3 ?= 12; 1*4+6 ?= 10
// ====TEST END====
//Note: The limitation happens between line 86 and line 88, we cannot insert any function here
// whose stack is larger than 40 bytes.(Why is 40? check the inline assembler language)

結(jié)果在MacOSX和Ubuntu上(i386)都能通過簡單的測試。但是可以看到,僅僅是簡單的模擬,我們也得用到大量(按比例)的匯編,可讀性很差,而且模擬程度非常有限,代碼長度也更長。相反,對于這類一般功能的函數(shù),Python可以很容易地模擬C語言的函數(shù),而且模擬程度很高。

以上這篇用C語言模仿Python函數(shù)的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實現(xiàn)基于EASYX庫掃描線算法

    C++實現(xiàn)基于EASYX庫掃描線算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)基于EASYX庫掃描線算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++?Boost?Xpressive示例分析使用

    C++?Boost?Xpressive示例分析使用

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C語言實現(xiàn)從文件讀入一個3*3數(shù)組,并計算每行的平均值

    C語言實現(xiàn)從文件讀入一個3*3數(shù)組,并計算每行的平均值

    今天小編就為大家分享一篇C語言實現(xiàn)從文件讀入一個3*3數(shù)組,并計算每行的平均值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言字符串替換空格實例詳解

    C語言字符串替換空格實例詳解

    這篇文章主要為大家詳細介紹了C語言字符串替換空格實例,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解C/C++如何獲取路徑下所有文件及其子目錄的文件名

    詳解C/C++如何獲取路徑下所有文件及其子目錄的文件名

    這篇文章主要為大家詳細介紹了在C/C++中如何獲取路徑下所有文件及其子目錄的文件名,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++ OpenCV實戰(zhàn)之手勢識別

    C++ OpenCV實戰(zhàn)之手勢識別

    這篇文章主要介紹了如何利用C++?OpenCV實現(xiàn)手勢識別,文中的示例代碼講解詳細,對我們學(xué)習OpenCV有一定幫助,感興趣的小伙伴可以了解一下
    2022-04-04
  • C語言實現(xiàn)洗牌與發(fā)牌游戲

    C語言實現(xiàn)洗牌與發(fā)牌游戲

    這篇文章主要為大家詳細介紹了C語言洗牌與發(fā)牌游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實現(xiàn)廣度優(yōu)先搜索實例

    C++實現(xiàn)廣度優(yōu)先搜索實例

    這篇文章主要介紹了C++實現(xiàn)廣度優(yōu)先搜索,對于C++程序員來說非常有借鑒價值,需要的朋友可以參考下
    2014-08-08
  • 超詳細講解C++的三種函數(shù)傳遞方式

    超詳細講解C++的三種函數(shù)傳遞方式

    這個文章我將把我學(xué)習的有關(guān)函數(shù)傳遞形式的知識做個總結(jié),相信很多剛?cè)腴T的同學(xué)看到許多文章五花八門的形參會感到頭疼,但本質(zhì)上無非就是我要說的三種傳遞形式,快來跟我一起學(xué)習吧
    2022-05-05
  • C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例

    C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例

    這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

巍山| 栾城县| 鹿泉市| 香格里拉县| 伊金霍洛旗| 宁南县| 崇明县| 修水县| 栖霞市| 改则县| 卓尼县| 莎车县| 龙陵县| 嵊州市| 板桥市| 二手房| 丁青县| 册亨县| 吕梁市| 合江县| 祁门县| 班玛县| 嘉祥县| 贡觉县| 汾西县| 临桂县| 东乡| 勃利县| 岚皋县| 太和县| 奉节县| 东乡| 永济市| 兴国县| 阳江市| 和田县| 盐山县| 射阳县| 泰和县| 隆安县| 渭源县|