单字符:
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() //返回输出的字符数,可以作为程序错误检验的依据
// 行
/**/ 块
· int --4 Bytes(常量同)
· float --8 Bytes
· bool --1 Bit
· double --
· char --1 Byte
·
var = var2;
var = value; //此表达式返回变量值
var = ++ var3;
int b = 0;
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
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
#include"filename" //在当前目录找filename
static //用于声明局部作用域,可以对函数,本地变量,全局变量使用,让其仅能在相应局部作用域使用
volatile //用于声明变量是随时可变的(线程数据共享,寄存器)
extern //变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义
命名规范,可读性好,不能用保留字
变量都有标识符和类型
匿名变量不能作左值
static int i; //i是静态本地变量,特殊的全局变量(static表示局部作用域),只能初始化一次,每次进入函数后值是上一次离开函数后的值,作用域是从定义之处开始,到文件结尾处结束即使在这个变量声明前的语句无法访问
extern int i; //声明i是全项目共享的全局变量,让编译器明白i在项目某处,让它去找值
通常大写,常量更好辨识
十进制 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)
12.3 == 1.23e1
'\123' --- 表示该字符ASCII码是 八进制的“123”
'\xFF' --- 表示该字符ASCII码是 十六进制的“FF”
'\b' --- backspace
'\r' --- carriage return
'\?' --- question mark
printf("hello,"
"world"); ---是可以的
printf("Hello, \
world"); ---也是可以的(world前面若有空格也会作为string的一部分)
123456789L
123456789ul
enum bool { false, true };
enum bool m = false; ----m == 0
定义一个类型bool,花括号里的名字若不初始化的话默认从0开始,不赋值的话后面的值总为前面值+1
使用时声明如上;
枚举的值只能是整数。
short int -- 16 bits
long int -- 8 bytes
long double --- 16 bytes
unsigned numbers --无符号数
sizeof() --返回字节数
+-*/ ---不同输出类型运算方法不同(典型的例子:整除)
% ---整数求模
优先级:左结合(+-*/%)
(unary)+ == (unary)- > (binary)* == / == % > (binary)+ > (binary)-
(unary)! > && > || ----非 > 与 > 或
赋值操作符:返回左操作数,遵循右结合
(x = 1) = 2 ---- 等价于x = 2
x = y = z = 100; ----x, y, z都是100
优先级见C programming language P42
操作符两旁数据类型不同时会触发类型转换
赋值时会类型转换 --- int d = 1.1; ----d == 1
运算符遵循由“窄”到“宽”原则 使用更“宽”的运算符,并转换数据类型
warning:规则上的错误不会触发类型转换(例如: 3.5%2 a[1.5])
char -> int 时,值不变
作为参数传递时也会触发类型转换
显式转换:(double)n ----n的值不受影响(中间过程存在匿名变量)
++ i ------令i = i + 1,并返回i + 1, 可作左值相当于i
i ++ ------令i = i + 1,并返回i的值(中间过程存在匿名变量),不可作左值
arr[i++]
*p++
据说比四则运算快
& | ^ << >> ~
把整数看成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,:
//冒号用于分配这个变量用几个位
= - * / % << >> & ^ | ----都有增强运算符
x &= x - 1 ----去掉x最后一位1
condition ? exp1 : exp2
若condition为真执行exp1并将结果作为返回值,为假执行exp2并将结果作为返回值
Morgan’s Law
Short-circuit operation
尽量减少逻辑运算符两边出现改变程序的表达式
可以用^来代替相等判断
switch(expression){
case const-expression: statements;(break;)
case const-expression: statements;(break;)
default:statement;
}
#include
#include
setw(int) //制造打印空间,之后打的字符太少则补空格,默认右对齐
cout << left ; //此语句后默认左对齐
setprecision(int) //设置有效数字,打印前int个数字(包括整数部分)
cout << fixed; //次语句后setprecision的有效数字从小数部分开始计
for ( ; i ; i ++ )
for-loop里的i++在循环一次后会执行,不受continue影响
引入flag变量,结合if语句可以辨认出所需的量,再count++
a good c program consists of many small functions instead of a few big ones
By ME and, ME
和c的风格不同,maybe
函数调用时才给 automatic variable 分配内存空间
1. 节省空间 2. 有利于空间重用
gcc *.c //编译一大把c文件
函数内部不能定义别的函数,但是可以声明哈哈哈。
also global variables;
functions share data among functions
functions communicate with others
函数内部要声明 extern int x ;否则会创建一个新的本地变量覆盖掉x;
不同文件共享一个全局变量的时候要声明 extern
static global variables or functions 这个变量(函数)只能在本文件访问(封装)
static internal variable 目的是防止x被外部访问且让x可以存在下去(方便创造每次调用返回值不同的函数)
void next()
{
static int next; //会自动初始化,global variable 也是
return ++ next;
}
寄存器是放在CPU里面的变量,操作可以更快,常被访问的变量可以放寄存器
只能用于局部变量,个数有限制,类型有限制,但声明其实是无害的
寄存器变量是没有地址的
block 就是 block
外部变量和静态变量自动初始化为 0
内部变量不自动初始化是因为当时计算机速度太慢
外部变量初始化要是一个常量
c++允许函数重名,用函数签名(名字和参数表类型)来区分
函数重载
近似匹配,完全匹配
struct Student {
int id;
int grades;
}student; //创建一个实例student
student={0, 0}; //直接赋值
```c