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. 201521123076 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  2. 201521123036 《Java程序设计》第10周学习总结

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

  3. 201521123079《java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 1.实现多线程的方式: 方式一:继承Thread类 a.自定义类继承Thread类 b.在自定义类中重写ru ...

  4. c# 浮点数计算问题

    给大家看个计算题,看看大家的算术能力. 0.1 +0.1 +0.1 - 0.3 等于几? 大家可能会说这么简单的问题,是不是看不起我?肯定等于0啊. 如果大家直接算的是没有问题的,但是如果用计算机呢? ...

  5. PHP命令注入笔记

    一.PHP命令注入介绍 在学习php相关的攻击时,遇到了Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域) ...

  6. Android 之异步加载LoaderManager

    LoaderManager: Loader出现的背景: Activity是我们的前端页面展现,数据库是我们的数据持久化地址,那么正常的逻辑就是在展示页面的渲染页面的阶段进行数据库查询.拿到数据以后才展 ...

  7. ArrayList底层实现原理

    ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现列表接口外,此类还提供一些方法来操作内部用来存储列表的数组 ...

  8. JavaScript简易计算器

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  9. 【重点突破】——Cookie的使用

    cookie:小甜饼 cookie:保存客户端浏览器中一个纯文本文件 版本高的浏览器可查看   F12->Resource  左下方cookie    查看 cookie作用: 保存:[安全性要 ...

  10. poj2528 线段树+离散化 (倒序)

    The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...