数据类型(基本类型下半)day3
4.转义字符
\n
换行 \t
跳下一个tab位置 \b
退格,当前位置移到前一列 \r
回车 将当前位置移到本行开头
\f
换页 当前位置移到下页开头 \\
反斜杠字符\
\ddd
1到3位八进制数 \xhh
1到2位十六进制所代表的字符
#if 0printf("abc\tij#k\n");printf("ab*c\t*de\rf\tg\n"); printf("\'A\'\n");printf("\"A\"\n");printf("'A'\n");printf("A\n");
#endifchar ch = 'B';printf("ch = %c:%d\n",ch,ch);ch = '\x42';printf("ch = %c:%d\n",ch,ch);ch = '\102';printf("ch = %c:%d\n",ch,ch);ch = 66;printf("ch = %c:%d\n",ch,ch);ch = 0102;printf("ch = %c:%d\n",ch,ch);ch = 0x42;printf("ch = %c:%d\n",ch,ch);
五:高内聚,低耦合
六:类型必转/隐式类型转换/强制类型转换符
1.二个方向:右到左,下到上
short ch1 = 'A';short ch2 = 'B';printf("sizeof(ch1 + ch2 ) = %d\n",sizeof(ch1 + ch2));//转int四字节大小,右到左float a;float b;printf("sizeof(a + b) = %d\n",sizeof(a + b));//看情况转float或double,下到上
2.隐式类型转换
从右向左 必转 char/short
必转成int
float
必转为double
(C99标准之后,不再必转)
从下向上 不同精度混合运算
低精度往高精度转
eg:10+‘a’+1. 5-765. 1234 *‘b’ 是double类型(看图)
注意:不要理解为int
型先转换成 unsigned int
型,再转成 long
型,再转成 double
型。如果 一个 int 型数据与一个 double
型数据运算,是直接将 int
型转成 double
型。
signed int a = -10;unsigned int b = 5;printf("a = %d\n",a);printf("a = %u\n",a);//%u 转为无符号输出if(a + b > 0){printf("yes\n");//隐式转换}else{printf("no\n");}int a = 10;int b = -5;printf("result = %f\n",a*1.0/b);//或者int改成double 都是一样的
七:除法/求余
1.除法 两个整型数相除,结果还是整型
2.求余 求余的被除数 不能为零 求余结果的符号(取决于左操作数) eg:10%3=1 -10%3=-1
应用:num % n = [0~N-1]
范围
八:random
/srandom
/time
long int random(void)
void srandom(unsigned int seed)
参数:void 返回值:long int
参数:seed
提供种子值 返回值:~
time_t time(time_t *tloc)
功能:获得当前时间的秒数值 参数:tloc NULL
空指针 返回值:time_t
//long int
#include<stdio.h>
#include<stdlib.h>
#include<time.h>int main(int argc, const char *argv[])
{int i = 0;srandom(time(NULL));for(i=0;i<10;i++){printf("%ld\n",random()%100);//printf("%ld\n",(random()%50)+50);}return 0;
}
九:强制类型转换符
printf("a = %f\n",(float)a);//(你想要的类型)-----这样可以强制类型转换 //注意:只是一个强制类型转换符,不会对运算数本身产生影响eg:float f = 12.3456;printf("f = %.2f\n",(int)(f*100)/100);
十:自增(increment)/自减(decrement)
1.a++ //先用后加 ++a //先加后用
前提是参与运算 运算数必须是一个左值
int a = 1;
float f = 12.345;
f = ++a;//可以这样用
十一:左右值问题
1.const int a = 10
//a被限定为只读变量
2.printf的一些逻辑问题
printf("%d\n",10++);//lvalue required as increment operand //10++是右值
3…左值----可定位的值 能做&(可取地址运算的) eg:变量
右值----不可定位的值 不能做&(可取地址运算的) eg:常量(10),常量表达式(1+2),匿名变量(a+b)
十二:贪心原则
1.i+++++i
C编译系统在处理时,尽可能多得(自左向右)将若干个字符组成一个运算符
((i ++) ++ ) + i
++是自右向左的逻辑,但是第二++向前结合时(它需要一个左值),i++
是表达式(是个右值),所以会编译错误。
rand_time.c:27:23: error: lvalue required as increment operand//报错消息printf("g = %d\n",g+++++g);
十三:不同精度数据间混合赋值
1.高精度=>低精度-------精度丢失 低精度=>高精度------高位截断
短类型=>长类型-------判断短类型是 有符号—符号位扩展 eg:0xffff8234 符号位1扩展1 0扩展0
无符号—默认统统补零 eg:0x8234
signed short b = 0x8234;// 0Xffff8234//unsigned short b = 0x8234;// 0x8234int a = 0;a = b;printf("a = %#X\n",a);
十四:逗号运算符(优先级最低)
1.a=3*5,a*4 = 60
赋值运算符的优先级别高于逗号运算符,因此应先求解a=3* 5(也就是把"a=3* 5"作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4, 得60。
2.一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式
eg:(a = 3*5,a*4),a+5
先计算出a的值为3*5
等于15,再进行a*4 的运算得60(但a值未变,仍为15),再进行 a+5 得 20, 即整个表达式的值为 20。
int b = 0;
b = (a++,1+2,a+1)//结果为12 //每个式子都要运算到,结果用不用到不用管