C基本类型

C基本类型有:

  char:8位,可添加修改符signed或是unsigned

  short:16位,同有singed和unsigned

  int:32位,同有singed和unsigned

long:在32位系统为32位,64位系统为64位,分为signed和unsigned

  long long:64位,分为signed和unsigned

  float:32位,精确度为6

  double:64位,精确度为15

  long double:80位,精确度为19

C中没有bool类型,可以引入stdbool.h文件使用定义的bool,true, false宏

常用字面值使用:

  int in = 1234;

  long ln = 1234L;

  unsigned int uin = 1234U;

  unsigned long uln = 1234UL;

  float  f = -12.34e-1f;

  double df = 123.45;

  long double ldf = 123.45L;

C GOTO使用示例

GOTO虽然会破坏程序的结构,使用代码可读性变差,但是GOTO依然还是有可用的地方

#include <stdio.h>
#include <stdbool.h>

int main()
{
  bool a = false;

step1:
  if (a)
    goto step2;
  while (true)
  {
    printf("while out\n");
    while (true)
    {
      printf("while inner\n");
      a = true;
      goto step1;
    }
  }

step2:
  return 0;
}

 

C setjmp和longjmp

#include <stdio.h>
#include <setjmp.h> void test(jmp_buf *env)
{
printf("setjmp test\n");
longjmp(env, 1);
} int main()
{
jmp_buf env; int ret = setjmp(env); if (!ret)
test(&env);
else
printf("longjmp... %d\n", ret); return 0;
}

int setjmp(jmp_buf env):函数会保存当前执行环境,初次调用时会返回0值;在调用链中如果遇到void long_jmp(jmp_buf env, int value)时会返回该处,并取得value值。

与goto相比,longjmp可以实现函数间的跳转,goto只能在函数内部跳转。

C 返回函数与闭包的考虑

#include <stdio.h>

typedef int (*fun)();

fun closure(int i)
{
int squ()
{
return i*i;
}
return squ;
} int main()
{ fun f = closure(2); printf("closure %d\n", f()); return 0;
}

C中函数的嵌套定义可以实现类似闭包的效果,只是如果函数是定义在一个循环中时,如:

    for (; i>arg-2; i--)
{
int squ()
{
return i*i;
}
arr[arg-i]=squ;
}

在最后使用arr函数数组时始终是指向最后定义的一个squ函数。查看2次循环时,发现squ始终指向同一个地址,所以此处认为C在处理时会将前面定义的squ函数覆盖。

这个现象和Python中的返回函数中,引用了可变化变量的现象不同,Python中在循环中定义的函数是指向不同的地址的。

C 实现可变参数

C中可以借助va_list实现可变参数:

va_start:使用传入的可变参数的第一个变量初始化va_list

va_arg:获取当前可变参数,每次调用时会将指针向后移

va_end:结束

利用这个机制实现可变参数时,需要保证传入的参数可判断结束位置,即第一个参数用于控制结束,同时传入的参数必须得有这个参数作为结束。

C可变参数的实现原理基于函数传参数的的栈,参数从右往左入

随机推荐

  1. 201521123095 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 Q1.finally 题目4-2 1.1 截图你的提交结果( ...

  2. 201521123016《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. 1 ...

  3. 让SAE下的wordpress支持文件上传

    非PHP程序员照着源码打的小布丁… SAE是不允许本地磁盘读写的,所以使用wordpress撰写文章的时候, 上传控件默认是用不了的,幸好SAE提供了storage服务来存储文件,那就可以修改word ...

  4. JavaSE(十)之Collection总结

    前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合. 一.Collection接口 首先我们要一张图来说明: Collection接口,它是集合的顶层接 ...

  5. openfire:Openfire源代码在eclipse中的运行配置 + 与spark结合进行二次开发

    1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...

  6. BootStrap基礎知識

    BootStrap基礎知識 1. .lead //突出 .text-left //文字居左 .text-right //文字居右 .text-center //文字居中 .text-justify / ...

  7. 【】小技巧】CSS文字两端对齐

    需求如下,红框所在的文字有四个字的.三个字的.两个字的,如果不两端对齐可以选择居中对齐,或者右对齐.但是如果要像下面这样两端对齐呢? 我相信以前很多人都这么干过:两个字中间使用 来隔开达到四个字的宽度 ...

  8. 《JavaScript闯关记》视频版硬广

    <JavaScript闯关记>视频版硬广 stone 在菜航工作时,兼任内部培训讲师,主要负责 JavaScript 基础培训,2016年整理的<JavaScript闯关记>课 ...

  9. Android方法数不能超过65535

    为什么方法数不能超过65535?搬上Dalvik工程师在SF上的回答,因为在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只给了16bits ...

  10. struts jar包

    这些错误很让我摸不着头脑,经多方查阅资料后,在Struts 2.2.x中应该导入如下7个JAR文件 1)   commons-fileupload-1.2.1.jar 2)   commons-io- ...