你真的了解C中的声明吗 —— 简版dcl程序

小测试看看你理解对几个:
char **argv
    argv: pointer to char array
int (*daytab)[13]
    daytab: pointer to array[13] of int
int *daytab[13]
    daytab: array[13] of pointer to int
void *comp()
    comp: function returning pointer to void
void (*comp)()
    comp: pointer to function returning void
char (*(*x())[])()
    x: function returning pointer to array[] of
    pointer to function returning char
char (*(*x[3])())[5]
    x: array[3] of pointer to function returning
    pointer to array[5] of char

-----------------------------------------------------------------------------------------------------------------------------------

/* dcl: parse a declarator */
void dcl(void)
{
    int ns;
    for (ns = 0; gettoken() == ‘*‘; ) /* count *‘s */
        ns++;
    dirdcl();
    while (ns-- > 0)
        strcat(out, " pointer to");
}
/* dirdcl: parse a direct declarator */
void dirdcl(void)
{
    int type;
    if (tokentype == ‘(‘) {
    /* ( dcl ) */
    dcl();
    if (tokentype != ‘)‘)
        printf("error: missing )\n");
    } else if (tokentype == NAME) /* variable name */
        strcpy(name, token);
    else
        printf("error: expected name or (dcl)\n");
    while ((type=gettoken()) == PARENS || type == BRACKETS)
        if (type == PARENS)
            strcat(out, " function returning");
        else {
            strcat(out, " array");
            strcat(out, token);
            strcat(out, " of");
        }
}

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
enum { NAME, PARENS, BRACKETS };
void dcl(void);
void dirdcl(void);
int gettoken(void);
int tokentype;/*type of last token */
char token[MAXTOKEN];/*last token string */
char name[MAXTOKEN];/*identifier name */
char datatype[MAXTOKEN];/*data type = char, int, etc. */
char out[1000];
main() /* convert declaration to words */
{
    while (gettoken() != EOF) {
        /* 1st token on line */
        strcpy(datatype, token); /* is the datatype */
        out[0] = ‘\0‘;
        dcl();
        /* parse rest of line */
        if (tokentype != ‘\n‘)
            printf("syntax error\n");
        printf("%s: %s %s\n", name, out, datatype);
    }
    return 0;
}

int gettoken(void) /* return next token */
{
    int c, getch(void);
    void ungetch(int);
    char *p = token;
    while ((c = getch()) == ‘ ‘ || c == ‘\t‘)
        ;
    if (c == ‘(‘) {
        if ((c = getch()) == ‘)‘) {
            strcpy(token, "()");
            return tokentype = PARENS;
        } else {
            ungetch(c);
            return tokentype = ‘(‘;
        }
    } else if (c == ‘[‘) {
        for (*p++ = c; (*p++ = getch()) != ‘]‘; )
            ;
        *p = ‘\0‘;
        return tokentype = BRACKETS;
    } else if (isalpha(c)) {
        for (*p++ = c; isalnum(c = getch()); )
            *p++ = c;
        *p = ‘\0‘;
        ungetch(c);
        return tokentype = NAME;
    } else
        return tokentype = c;
}
时间: 2024-08-05 21:37:48

你真的了解C中的声明吗 —— 简版dcl程序的相关文章

你真的了解JAVA中与Webservice相关的规范和实现吗?

非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JAVA 中共同拥有三种WebService 规范,各自是JAXM&SAAJ.JAX-WS(JAX-RPC).JAX-RS. 以下来分别简要的介绍一下这三个规范.针对JDK 1.6以下版本号,新的还没研究过 (1.)JAX-WS: JAX-WS(Java API For XML-WebService),

javascript中变量声明要早于赋值

javascript中变量声明要早于赋值:这里只做简单的现象介绍,具体不做深究,先看一段代码实例: var webName="蚂蚁部落"; document.write(webName); 对于这段代码应该没有任何问题,输出结果是:蚂蚁部落.再来看一段代码: document.write(webName); var webName="蚂蚁部落"; 按照代码是顺序执行的理论,以上代码应该会报错才对,但是这里输出结果却是:undefined.这说明在执行输出之前,变量已

javascript中函数声明和函数表达式浅析

记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好.最近正好看到这方面的书籍,就想好好总结一番. 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identif

angularjs中directive声明scope对象时修饰符解释和用法

在angular中我们定义directive方法时,可以看到 return { restrict: 'AE', scope: {}, template: '<div></div>', link: function() {} } 除了代码中出现的属性,还有一些其他的属性可供配置,这里不作详述. 今天我们要说的重点是scope字段. 常规用法设置 scope: { name: '=', age: '=', sex: '@', say: '&' } 假设我们的hml代码如下 &l

javascript中定义声明函数的四种方法

javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N

错误:‘uuid_t’在此作用域中尚未声明

安装TFS报错: session_util.cpp: In static member function 'static std::string tfs::common::SessionUtil::gene_uuid_str()': session_util.cpp:17: 错误:'uuid_t'在此作用域中尚未声明 session_util.cpp:17: 错误:expected ';' before 'uu' session_util.cpp:18: 错误:'uu'在此作用域中尚未声明 se

JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式: function functionName(){ } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如: var functionName = function(){ } 可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢? 事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的.对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同

C++中的声明和定义

<C++Primer>第四版 2.3.5节中这么说到: ① 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ② 变量声明:用于向程序表明变量的类型和名字. ③ 定义也是声明:当定义变量时我们声明了它的类型和名字. ④ extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义 int

Java中循环声明变量方法

Java循环声明变量 之前想这样做,但是网上一直搜索不到,下面是我的方式 项目中 // 得到需要查询外表的数量,然后分别创建缓存,插入数据多的时候如果编码在缓存里面,就不需要再去查询数据库了.key:code/value:pk // 根据"数据来源"有多少非空的 就创建几个,使用 "数据来源字段"+Cache 当cacheMap的key Map<String, Map<String, String>> cacheMap =new HashMa