欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c(++)

程序员文章站 2022-03-07 16:18:00
...

C programming

Output

单字符:

putchar('char')

cout << 'char';
cout << '\'';

多字符:

printf("str");

cout << "str";

格式化输出:

"%d", int
"1.6f%", float   //'1'表示至少1 Byte

cout << "str" << int << endl
//formatting output
%[flags][width][.prec][hiL]type 
flags(标志):   
/*   
 -     //左对齐  
 +     //强制输出加号  
 0     //0填充  
 space //强制在结果前加一个空格(负数则输出负号)
 #     //保证浮点数定会输出一个小数点
*/
width: 
/*          
            数字 //最小字符数
            *    //下一个参数是字符数
            .数字  //小数点后位数
            .*       //下一个参数是小数点后位数


         */

hiL(修饰符):
/*
和类型说明符一起使用,表示延伸的变量类型
h  //unsigned short int
hh //char
ll  // long long
L  //long double
z  //sizeof()专用类型
*/
type:  
/*  
    %f  //float 6位小数
    %g  //float   
    %n  //统计%n之前出现过多少个字符并赋给一个地址(&num)   
    %a或%A  //十六进制浮点 
*/ 
printf()   //返回输出的字符数,可以作为程序错误检验的依据

Comments:

//  行
/**/ 块

变量(variable type):

· int        --4 Bytes(常量同)
· float      --8 Bytes
· bool       --1 Bit
· double     --   
· char       --1 Byte
· 

evaluation:

var = var2;  
var = value; //此表达式返回变量值
var = ++ var3;

initialization

int b = 0;

type conversion

int --> char  ----丢掉高位字节
char --> int  ----先赋低位字节,如果低位字节的最高位是0,前面都补0;是1,则补1
10000000 --> -128
01111111 --> 127
-n == ~n+1 --->'~'取反符号,即每个bit 0 -> 1, 1 -> 0.




bool isMale = 100;     ---- isMale == 1
hexadecimal  --
octonary
binary

input

cin >> var >> var2 >> var3;  ---非链式赋值而是多个赋值

//formatting input
%[flag]type
flag: /*     *   //跳过这个type
            数字 //最大字符数
            hh  // char
            h  // short
            l  // long or double
            ll  // long long
            L   //long double

        */
type:/*
    %d   //十进制整数
    %i   //按照类型判断进制的整数类型
    %a, e, f, g    //浮点数
    %[^]    //过于复杂,暂不赘述

*/
scanf()  //返回输入的item数

宏(完全的文本替换)

__宏名字__   //预定义的宏,代表一些特殊的值,例如文件名,行数,系统时间
#define mm     // (mm) 是宏的名字,这表明mm是一个空的宏(一般用于条件判断),一般一行写完,用\可以写多行

#define max(a, b) (a > b ? a : b)   //带参数的宏

#ifndef 宏名字      /* 若宏没被定义过则执行ifndef与endif之间的内容*/
#endif                 
#include<filename>  //在标准库里找filename

#include"filename"  //在当前目录找filename

声明

static  //用于声明局部作用域,可以对函数,本地变量,全局变量使用,让其仅能在相应局部作用域使用
volatile  //用于声明变量是随时可变的(线程数据共享,寄存器)
extern //变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义

identifier

命名规范,可读性好,不能用保留字

variable

变量都有标识符和类型
匿名变量不能作左值

static int i; //i是静态本地变量,特殊的全局变量(static表示局部作用域),只能初始化一次,每次进入函数后值是上一次离开函数后的值,作用域是从定义之处开始,到文件结尾处结束即使在这个变量声明前的语句无法访问
extern int i; //声明i是全项目共享的全局变量,让编译器明白i在项目某处,让它去找值

const

通常大写,常量更好辨识

literal(常量值)

  1. int
十进制 123
八进制 0173 --零开头则是八进制
十六进制 0x7B == 0X7B --0x(X)开头是十六进制
·representing negative values
    1. 思路: 用高位整数映射负数(补码)   ---待证明
    2. 对称性,正数的补码还是它本身
    3. 例子(ten's complement):Negative(i) = 10^k - i,where k is the number of digits.  ---binary negative(i) = 2^k - i
    4. binary 最高位为1的为负数
    5. 反码(取反后的bits序列)+1即为补码
    6. 计算机算数时要么得到结果,要么溢出(Overflow)
        ·Overflow is ...
        .正正得负,负负得正(相加运算),则溢出
        .永远别太相信计算机计算的结果(怕溢出)
.bit(位)  1 or 0
.byte(字节)    8bits
    .c types maybe int8_t, uint8_t, char
.representing fraction part
    1. 移位操作 << >>  等价于乘(除)base
    2. 少判断两个表面看起来相等的数是否相等
        ·(float)0.15 != (float)0.45 / 3    
    3. 小数点
        ·定点表示法  --用固定的byte表示小数部分,别的byte表示整数,泾渭分明
        ·浮点表示法  --科学计数法 sign * mantissa * 2^exp用exp来决定小数点要移动的位(单独拿出一位来作为sign)        
  1. float
    12.3 == 1.23e1
  2. char
'\123'  --- 表示该字符ASCII码是 八进制的“123”
'\xFF'  --- 表示该字符ASCII码是 十六进制的“FF”
'\b'    --- backspace
'\r'    --- carriage return 
'\?'    --- question mark

  1. string
printf("hello,"
"world");   ---是可以的

printf("Hello, \
world");  ---也是可以的(world前面若有空格也会作为string的一部分)


  1. long int
    123456789L
  2. unsigned long int
    123456789ul
  3. enum
enum bool { false, true };
    enum bool m = false;   ----m == 0
定义一个类型bool,花括号里的名字若不初始化的话默认从0开始,不赋值的话后面的值总为前面值+1
使用时声明如上;
枚举的值只能是整数。

Data Types and Sizes

short int -- 16 bits
long int -- 8 bytes
long double --- 16 bytes
unsigned numbers --无符号数
sizeof() --返回字节数

Arithmetic Operators

+-*/ ---不同输出类型运算方法不同(典型的例子:整除)
%    ---整数求模
优先级:左结合(+-*/%)
(unary)+ == (unary)- > (binary)* == / == % > (binary)+ > (binary)-
(unary)! > && > ||    ----非 > 与 > 或
赋值操作符:返回左操作数,遵循右结合
(x = 1) = 2   ---- 等价于x = 2
x = y = z = 100;   ----x, y, z都是100 

优先级见C programming language P42

Type Conversions

操作符两旁数据类型不同时会触发类型转换

赋值时会类型转换 ---   int d = 1.1;     ----d == 1
运算符遵循由“窄”到“宽”原则 使用更“宽”的运算符,并转换数据类型
warning:规则上的错误不会触发类型转换(例如: 3.5%2  a[1.5])
char -> int 时,值不变
作为参数传递时也会触发类型转换
显式转换:(double)n ----n的值不受影响(中间过程存在匿名变量)

Increment and decrement


++ i ------令i = i + 1,并返回i + 1, 可作左值相当于i
i ++ ------令i = i + 1,并返回i的值(中间过程存在匿名变量),不可作左值
arr[i++]
*p++

Bitwise operator

据说比四则运算快

& | ^ << >> ~

把整数看成bit组成的序列

按位与:& 每一位进行与运算(1与1等于1,其他都为0), (按位与1可以消除前面的所有位)用于取某些位的一段

按位或:可用于把两个数拼起来

按位异或:0^0 and 1^1 == 0, 否则 == 1 x ^ y ^ y == x

按位取反:’~’ 0->1 1->0 -x = ~(x - 1)

左移右移: 1. << 整个序列往左移动,多的位补0
2. >> ·有符号补符号位
·没符号补0
3. 等价于乘除2

struct bitpass{
    int a : 2;
}        //位段 整个结构体公用n个int,: 
         //冒号用于分配这个变量用几个位

Assignment Operators

= - * / % << >> & ^ |     ----都有增强运算符
x &= x - 1                ----去掉x最后一位1 

Conditional Expression

condition ? exp1 : exp2
若condition为真执行exp1并将结果作为返回值,为假执行exp2并将结果作为返回值

Boolean expression

Morgan’s Law

Short-circuit operation

尽量减少逻辑运算符两边出现改变程序的表达式

可以用^来代替相等判断

switch statement

switch(expression){
    case const-expression: statements;(break;)
    case const-expression: statements;(break;)
    default:statement; 
}

C++ formatting output

#include<iostream>
#include<iomanip>
setw(int)  //制造打印空间,之后打的字符太少则补空格,默认右对齐
cout << left ; //此语句后默认左对齐
setprecision(int) //设置有效数字,打印前int个数字(包括整数部分)
cout << fixed; //次语句后setprecision的有效数字从小数部分开始计

for-loop

for ( ; i ; i ++ )

for-loop里的i++在循环一次后会执行,不受continue影响

引入flag变量,结合if语句可以辨认出所需的量,再count++

function

a good c program consists of many small functions instead of a few big ones

By ME and, ME

和c的风格不同,maybe

函数调用过程

  1. 分配callee中定义变量的空间(函数返回的变量,本地变量,匿名变量(可重用))(连续空间)
  2. 传参:把实参赋给形参
  3. 运行callee
  4. 返回值(匿名变量储存)
  5. 释放匿名变量
  6. caller继续运行
  7. 常量属于全局变量
  8. 函数内调用的函数调用函数时,前两个函数都在运行

local variable

函数调用时才给 automatic variable 分配内存空间

   
    1. 节省空间
    2. 有利于空间重用

return type

gcc *.c //编译一大把c文件

declaration

函数内部不能定义别的函数,但是可以声明哈哈哈。

external variables

also global variables;

functions share data among functions

functions communicate with others

函数内部要声明 extern int x ;否则会创建一个新的本地变量覆盖掉x;

不同文件共享一个全局变量的时候要声明 extern

static external variables and functions

static global variables or functions 这个变量(函数)只能在本文件访问(封装)

static internal variable 目的是防止x被外部访问且让x可以存在下去(方便创造每次调用返回值不同的函数)

void next()
{
    static int next;    //会自动初始化,global variable 也是
    return ++ next;
}

register variable

寄存器是放在CPU里面的变量,操作可以更快,常被访问的变量可以放寄存器

只能用于局部变量,个数有限制,类型有限制,但声明其实是无害的

寄存器变量是没有地址的

block

block 就是 block

initialization

外部变量和静态变量自动初始化为 0

内部变量不自动初始化是因为当时计算机速度太慢

外部变量初始化要是一个常量

function matching(c++)

c++允许函数重名,用函数签名(名字和参数表类型)来区分

函数重载

近似匹配,完全匹配

structure

struct Student {
    int id;
    int grades;
}student; //创建一个实例student

student={0, 0}; //直接赋值
```c















相关标签: c