C语言知识总结(三)运算符、进制转换、输入输出

524 阅读8分钟

1、进制之间的转换

其他进制转换为二进制

1、八转二:123.6,首先,将每一位数字,一分为三。1=001 2=010 3=011 0.6=110 然后合起来:0010 1001 1.110=1010 011.11(可将整数高位的零省略,小数低位的零不写)

2、十转二 方法一:整数除R取余法,小数乘E取整法: 如:14.875:整数部分除2取余,小数部分乘2取整

整数 14/2 商7余0 7/2 商3余1 3/2 商1余1 1/2 余0 除到商数零为止 小数 875 * 2=1.750 取1 . 075 * 2=1.50 取1 0.5 * 2=1.0 取1 乘到所需要的精度或者积为零为止 然后 : 整数从高位(后面)写,小数从低位(前面)写。 14.875十进制转为二进制等于 1110.111

十转二 方法二:如 46 :他最大只能分配 32位字节,46-32=14,最大3

只能分配8个字节,14-8=6,最大只能分配4个字节,4-2=2。到此结束 它们分别是 2^5 2^3 2^2 2^1 然后分别在 第六位上填个1,第四位上填个1,第三位上填个1,第二位上填1 ,其他位均是零 :46 十转二 101110

3、十六转二: 84.cf 一分位为四,规则方法与八转二相同, 8=1000 4=0100 12=1100 16=1111 合起来:1000 0100 0100.1100 1111

其他进制转八进制

1、二转八 : 规则:整数部分 从低位到高位,每三位为一组,最高位不足三位时高位补零,小数从低位到高位,每三位一组,最低位不足三位时低位补零。 1011 1100 011.11=001 011 110 011.110 =1 3 6 3 . 6 2、十进转八:(规则和十转二一致)除R取余法,乘E取整法 25.35 :整数 25/8 商3 余1 3/8 余3 除到商数零为止 小数 0.35

2、十进转八:(规则和十转二一致)除R取余法,乘E取整法 25.35 :整数 25/8 商3 余1 3/8 余3 除到商数零为止 小数 0.35 * 8=2.80 取2 0.8 * 8=6.4 取6 0.4 * 8=3.2 取3 0.2 * 8=1.6 取1 乘到所需要的精度或者积为零为止。 25.35十转八31.2331

3、十六转八 一般的方法是先其他进制做为媒介,先转为其他进制再从其他进制转为八进制。 如 84.cf 先转为二进制:8=1000 4=0100 12=1100 16=1111 总:1000 0100.1100 1111 (按照二转八规则)010 000 100.110 011 110= 204.636

其他进制转为十进制

1、十六转十(5F):5 * 16^1+15 * 16^0= 95 2、八转十 (123.4):1 * 8^2+2 * 8^1+3 * 8^0+4 * 8^-1= 83.5 3、二转十 (1101.11):1 * 2^3+1* 2^2+0 * 2^1+1 * 2^0+1 * 2^ -1+1 * 2^-2=13.75

其他进制转为十六进制

1、二转十六,规则同二转八一样,只不过是四合一: 1010 1011 110.011=0101 0101 1110.0110=55E.6

2、八进制转十六进制,只能是用其他进制做为媒介,转为其他进之后再转为十六进制

3、十转十六,方法一: 用其他进制做媒介 先转为其他进制再转为十六进制。 方法二 :用整数除16取余法,小数用乘16取整法。

2、运算符

优先级运算符含义说明结合方向
1( )圆括号自左向右
1[ ]下标符自左向右
1->用指针时访问结构体成员符自左向右
1.访问结构体成员符自左向右
2!逻辑非符1(单目运算符)自右向左
2~按位取反符1(单目运算符)自右向左
2++自增符1(单目运算符)自右向左
2--自减符1(单目运算符)自右向左
2-负号符1(单目运算符)自右向左
2(类型)强制类型转换符1(单目运算符)自右向左
2*指针符1(单目运算符)自右向左
2&取地址符1(单目运算符)自右向左
2sizeof字节长度符1(单目运算符)自右向左
3*乘法符2(双目运算符)自左向右
3/除法符2(双目运算符)自左向右
3%求余(模)符2(双目运算符)自左向右
4+加法符2(双目运算符)自左向右
4-减法符2(双目运算符)自左向右
5<<左移符2(双目运算符)自左向右
5>>右移符2(双目运算符)自左向右
6< <= > >=(大小)关系符2(双目运算符)自左向右
7==等于符2(双目运算符)自左向右
7!=不等于符2(双目运算符)自左向右
8&按位与符2(双目运算符)自左向右
9^按位异或符2(双目运算符)自左向右
10|按位或符2(双目运算符)自左向右
11&&逻辑与符2(双目运算符)自左向右
12||逻辑或符2(双目运算符)自左向右
13? :条件运算符3(三目运算符)自右向左
14= += -= *= /= %= >>= <<= &= ^= |=各种赋值运算符2(双目运算符)自右向左
15,逗号符自左向右

说明:同一优先级时,运算方向按照结合方向决定。

自增(自减)i++与++i的不同

i++表示先使用i的值之后再+1 ++i表示先+1

从上述表中可以大致归纳出各类运算符的优先级:
    初等运算符(  )[  ] ->  .  

          ↓
    单目运算符
         ↓ 
    算述运算符(先乘除,后加减)
         ↓ 
    关系运算符 
          ↓
    逻辑运算符(不包括!)
         ↓
    条件运算符 
         ↓

      逗号符


printf函数:

format -- 是格式控制字符串,其中两种类型的对象:普通字符和转换说明(加%那种) 。在输出时,普通字符将原样不动地复制到标准输出,转换说明并不直接输出而是用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明结束,从而说明输出数据的类型、宽度、精度等

函数原形: %[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]说明符 (其中如果加转换说明时,%和 说明符(格式符)不能省略,其他均可)

函数表示在format的控制下,将其参数进行格式化,然后再输出打印出来。 如果函数执行成功,则返回打印字符的数量,失败则返回负数。

printf 函数的返回值为其输出字符串常量的字符数(注意字符数与字数的区别),注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。

printf函数输出方向是自右到左的。 图解:








scanf函数

标准输入流stdin:它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符从流中提取数据,注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区(sell),形成输入流,提取运算符才能从中提取数据。需要注意保证从流中读取数据能正常运行

scanf函数是从stdin中读取内存的子程序。并将数据保存在变量的地址中。

scanf函数返回成功读入的数据项数。函数返回值为int型。

如果a和b都被成功读入,那么scanf的返回值就是2; 如果只有a被成功读入,返回值为1 如果a和b都未被成功读入,返回值为0;

如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。

函数原形: int scanf (const char * restrict format,...);(存储顺序由编译器决定)

**注意:

(1)在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf。
(2) 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
 (3) 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。
(4) scanf函数中没有类似printf的精度控制。 如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。
 (5) scanf中要求给出变量地址,如给出变量名则会出错 如 scanf("%d",a);是非法的,应改为scanf("%d",&a);才是合法的。
 (6) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。 (7) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。 (scanf有一个明显的优点,速度比cin函数快)

图解: