位运算
// 按位与&: 2 & 3 = 2; 010 & 011 = 010   两个1才为1
// 按位或|: 2 | 3 = 3; 010 | 011 = 011   只要1个为1则为1
// 按拉异或: 2 ^ 3 = 1;  010 | 011 = 001   不同则为1
 
// 结合律:(a & b) & c = a & (b & c)
// 交换律: a & b  = b & a
 
/****************左移和右移注意点:****************\
  左移运算符 <<                                 
     规则: 高位丢弃,低位补0                   
  右移运算符 >>                                 
     规则: 高位补符号位,低位丢弃              
 
/*********************防错准则*********************\
 避免位运算符,逻辑运算符和数学运算符同时出现在一个
 表达式中。(位运算优先级低于加减法运算)         
 需要同时参与运算时,尽量使用()来表达计算效仿次序
 
// 小技巧:
// 左移n位相当于乘以2的n次方
// 右移n位相当于除以2的n次方
// 位运算效率比数学运算高。
 
#define SWAP3(a, b) \
{                   \
    a = a ^ b;      \
    b = a ^ b;      \
    a = a ^ b;      \
}
// 交换
// a = (a ^ b)
// b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a;
// a = a ^ (a ^ b) = (a ^ a) ^ b = b;
 

 
条件编译
/**********************************************\
 通过编译器命令行能够定义预处理器使用的宏     
 条件编译可以避免重复包含同一个头文件         
 条件编译是在工程开发中可以区别不同产品线的代码
 条件编译可以定义产品的发布版和调试版      
 

sizeof
 sizeof是编译器的内置指示符,不是函数
 sizoof用于“计算”相应实体所占的内存大小
 sizeof的值在编译期就已经确定

const
const修饰的变量是只读的,其本质还是变量
const修饰的变量会在内存占用空间
本质上const只对编译器有用,在运行时无用
 
  const int* p;         // p可变,p指向的内容不可变
  int const* p;         // p可变,p指向的内容不可变
  int* const p;         // p不可变,p指向的内容可变
  const int* const p;   // p和p指向的内容不可变
 
  口诀: 左数右指
  当const出现在*号左边 时指针指向的数据为常量
  当const出现在*号后边时指针本身为常量
 
* const修饰函数参数表示在函数体内不希望改变参数的值
* const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
 

 
volatile
 
 可理解为“编译器指示字”
 volatile用于告诉编译器必须每次去内存中取变量值
 volatile主要修饰可能被多个线程访问的变量
 volatile也可以修饰可能被未知因素更改的变量
 
    int obj = 0;
    int a = 0;
    int b = 0;
 
    a = obj;
    sleep(100);
    b = obj;
    // 编译器在编译的时候发现obj没有被当成左值使用
    // 因此会“聪明”的直接将obj替换成10
    // 把a和b都直接赋值为10.
 
    // 可能出现的问题:在sleep(100)的时间内
    // 如果obj由于其它因素被修改,b的值被赋值为10。   
 
    // 解决方法:在obj之前加上volatile
 

 
union
 
struct中的每个域在内存中都独立分配空间
 union只分配最大域空间,所有域共享这个空间
 
 union的使用受系统大小端的影响(可通过union判断系统大小端)
 
int checkSys()
{
    union check
    {
        int i;
        char c;
    } cc;
    cc.i = 1;
    return cc.c == 1;  // 若等于1,则系统为小端模式,否则为大端模式
}
 

typedef
 
 typedef用于给一个已经存在的数据类型重命名
 typedef并没有产生新的类型
 typedef重定义的类型不能进行unsigned和signed扩展
 
typedef和#define的区别 :
typedef是给已有类型取别名              
#define为简单的字符串替换,无别名的概念 
 

enum
  enum是一种自定义类型
  enum默认常量在前一个值的基础上依次加1
  enum类型的变量只能取定义时的离散值
 
***********************枚举类型和#define的区别***********************
 #define宏常量只是简单的进行值替换, 枚举常量才是真 正意义上的常量                                    
 #define宏常量无法被调试,枚举常量可以             
 #define宏常量无类型信息,枚举常量一种特定类型的常量
 

 
单引号和双引号
 
 本质上单引号括起来的一个字符代表整数
 双引号括起来的字符代表一个指针
 C编译器接受字符和字符串的比较,可意义是错误的
 C编译器允许字符串对字符变量赋值,其意义是可笑的。
 

 
 

 
 

一些C语言基础知识的更多相关文章

  1. OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  2. 李洪强iOS开发之OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  3. Golang 入门系列(三)Go语言基础知识汇总

    前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...

  4. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  5. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  6. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

  7. C语言基础知识-运算符与表达式

    C语言基础知识-运算符与表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用运算符分类 1>.算术运算符 用于处理四则运算. 2>.赋值运算符 用于将表达式的 ...

  8. C语言基础知识-数据类型

    C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...

  9. 重拾C语言基础知识

    从实习到工作两年多的时间了,虽然感觉学到了很多知识,但是事实上却将立足之本的基础知识给忘了个精光.也许跟自己没有出去找工作有关,没有好好的将C语言的基础牢牢掌握. 从现在开始吧!好好的重温基础,做一名 ...

  10. ZYNQ笔记(0):C语言基础知识复习

    ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能.我本科学C语言时就是对付考试而已,导致现在学ZYNQ是一脸懵逼.现在特开一帖,整理一下C语言的基础知识. 一.定义 1. ...

随机推荐

  1. vue笔记未整理

    全局组件 局部组件 子组件传值到父组件 父子组件传值 watch跟计算属性差不多,都会有缓存,计算属性优先 计算属性get set 对象 数组 对象 数组 不复用 改变数组 直接修改数组,页面没变化 ...

  2. shell编程企业级实战

    如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...

  3. android等待对话框

    等待对话框,这里有两种方式来实现: ProgressDialog方式 progressDialog初始化 private void initProgressDialog() { progressDia ...

  4. Linux新手随手笔记1.1

    ifconfig   查询网卡信息 分别是网卡名称,物理IP地址,MAC地址,RX收到数据包大小,TX发送数据包大小 # uname # uname -a 查看内核版本号 # hostname 查看主 ...

  5. Python之路【第十七篇】:Django【进阶篇 】(转自银角大王博客)

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  6. scrollbar样式设置

    转载:https://segmentfault.com/a/1190000012800450?utm_source=tag-newest author:specialCoder 一 前言 在CSS 中 ...

  7. .Net Core学习地址

    官方教程:https://docs.microsoft.com/zh-cn/aspnet/core/ 入门无忧网:http://www.rm5u.com/netcore/netcore-intro.h ...

  8. day13

    今日所学 1,函数的嵌套定义 2,globe   nonlocal关键字 3,闭包及闭包的运用场景 4,装饰器 函数的嵌套: 在一个函数的内部定义另一个函数 1,函数2想直接使用1函数的局部变量,可以 ...

  9. 上传图片,通过node服务器存储在指定目录

    最近做毕设,需要上传图片,因为在本地服务器运行,所以想着前端上传后,通过node服务器接收图片,存储在指定的目录下. 一.前端实现 1.前端的页面和上传图片是利用element-ui组件实现的,&qu ...

  10. python3.7安装pylint

    python3.7安装pylint之"setuptools"版本错误 借鉴:错题集(已解决):pyinstaller报错ModuleNotFoundError: No module ...