C语言基础知识(二)-输入、输出以及运算符,写给1-3年Android程序员的几点建议

#include <stdio.h>

int main()

{

int e1=2021, e2=666, e3=520, e4=1314;

int f1=6666666, f2=7777, f3=888888, f4=9999;

printf(“%-4d %-4d %-4d %-4d\n”, e1, e2, e3, e4);

printf(“%-4d %-4d %-4d %-4d\n”, f1, f2, f3, f4);

return 0;

}

运行结果:

2021 666  520  1314

6666666 7777 888888 9999

输出结果说明:

指定输出宽度为4,6666666和888888的宽度6,超过了 4,所以指定输出宽度不再起作用,而是按照f1和f3的实际宽度输出。

3、%x、%X、%#x、%#X的区别

#include <stdio.h>

int main()

{

int i = 42;

printf("%x |%X |%#x |%#X ", i, i, i, i);

return 0;

}

运行结果:

2a |2A |0x2a |0X2A

输出结果说明:

  • 如果是小写的x,输出的字母就是小写的;

  • 如果是大写的X,输出的字母就是大写的;

  • 如果加一个"#",就以标准的十六进制形式输出。

最好是加一个"#“,否则如果输出的十六进制数正好没有字母的话会误认为是一个十进制数呢!总之,不加”#"容易造成误解。但是如果输出0x2a或0x2a,那么人家一看就知道是十六进制。而且%#x和%#X中,笔者觉得大写的比较好,因为大写是绝对标准的十六进制写法。所以在输出十六进制的时候使用"%#X"比较好。

标志字符


flag 是标志字符。例如,%#X中 flag 对应 #,%-9d中 flags 对应-。printf()可以用的 flag有下面几个:

  • 1)-:表示左对齐。如果没有,就按照默认的对齐方式,默认一般为右对齐。

  • 2)+:用于整数或者小数,表示输出符号(正负号)。如果没有,那么只有负数才会输出符号。

  • 3)空格:用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。

  • 4)#

  • 对于八进制(%o)和十六进制(%x/%X)整数,#表示在输出时添加前缀;八进制的前缀是0,十六进制的前缀是 0x/0X。

  • 对于小数(%f/%e/%g),#表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 #以后,即使没有小数部分也会带上小数点。

举个栗子熟悉一下标志字符

#include <stdio.h>

int main(){

int m = 422, n = -1009;

float f = 520.1314;

printf(“m=%6d, m=%-6d\n”, m, m);  //演示-的用法

printf(“m=%+d, n=%+d\n”, m, n);  //演示+的用法

printf(“m=% d, n=% d\n”, m, n);  //演示空格的用法

printf(“f=%.0f, f=%#.0f\n”, f, f);  //演示#的用法

return 0;

}

运行结果:

m=   422, m=422

m=+422, n=-1009

m= 422, n=-1009

f=520, f=520.

输出结果说明:

  • 当以%6d输出 m 时,是右对齐,所以在422前面补3个空格;当以%-6d输出 m 时,是左对齐,所以在422后面补3个空格。

  • m 是正数,以%+d输出时要带上正号;n 是负数,以%+d输出时要带上负号。

  • m 是正数,以% d输出时要在前面加空格;n 是负数,以% d输出时要在前面加负号。

  • %.0f表示保留 0 位小数,也就是只输出整数部分,不输出小数部分。默认情况下,这种输出形式是不带小数点的,但是如果有了#标志,那么就要在整数的后面"硬加上"一个小数点,以和纯整数区分开。

printf()不能立即输出的问题


先看栗子

#include<stdio.h>

#include<unistd.h>

int main()

{

printf(“帅次真的帅吗:”);

sleep(5);  //程序暂停5秒钟

printf(“上下五千年的帅”);

return 0;

}

这段代码使用了两个 printf() 语句,它们之间有一个 sleep() 函数,该函数的作用是让程序暂停 5 秒,然后再继续执行。sleep() 是 Linux 和 Mac OS 下特有的函数,不能用于 Windows。当然,Windows 下也有功能相同的暂停函数,叫做 Sleep()。

运行该程序,会发现第一个 printf() 并没有立即输出,而是等待 5 秒以后,和第二个 printf() 一起输出了。

有种情况在第一个 printf() 的最后添加一个换行符,如下所示:

printf(“帅次真的帅吗\n”);

效果就是编译并运行程序,发现第一个 printf() 首先输出(程序运行后立即输出),等待 5 秒以后,第二个 printf() 才输出。目的一下达到了。

因为我用的是Windows版在线编译,所以两种情况都是等待5秒一起输出。这个你们可以亲测一下。

为什么不能立即输出?

这一切都是输出缓冲区(缓存)在作怪!从本质上讲,printf() 执行结束以后数据并没有直接输出到显示器上,而是放入了缓冲区,直到遇见换行符"\n"才将缓冲区中的数据输出到显示器上。

输出小结


  • 1)转换说明符在某些系统中对大小写敏感,请注意不同系统的要求。如%f不能写成%F。

  • 2)格式控制字符串中,可以有转义字符,如"\n"、“\b”、"\xab"等。

  • 3)格式符以%开头,以格式转换符结束,中间有一些修饰作用的其他字符。

  • 4)输出字符"%"时,可以用连续的两个%。

  • 5)不同系统中实现格式输出时,输出结果的精度可能有差别。

  • 6)printf()函数由于要解析格式控制字符串,比较耗费资源。如果是打印一个字符,可以用putchar()函数;如果仅仅是简单地打印字符串,可以用puts()函数。

  • 7)对于printf()函数的输出表列中的求值顺序,不同的编译系统不一定相同,可以从左到右,也可从右到左。LCC编译系统就是从左到右,而TC是从右到左。

对于初学者的咱们来说,上面讲到的 printf() 用法已经比较复杂了,基本满足了实际开发的需求,相信大家也需要一段时间才能熟悉。受到所学知识的限制,本文也未能讲解 printf() 的所有功能,后续咱们还能不能深入,就看自己的了。

输入

==

在C语言中,有多个函数可以从键盘获得用户输入:

  • scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。

  • getchar()getche()getch():这三个函数都用于输入单个字符。

  • gets():获取一行数据,并作为字符串处理。

scanf()是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数。

scanf()函数


scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。scanf的功能用一句话来概括就是通过键盘给程序中的变量赋值

下面面咱们先看一个栗子:

#include <stdio.h>

int main()

{

int a = 0, b = 0, c = 0, d = 0;

scanf(“%d”, &a);  //输入整数并赋值给变量a

scanf(“%d”, &b);  //输入整数并赋值给变量b

printf(“a+b=%d\n”, a+b);  //计算a+b的值并输出

scanf(“%d %d”, &c, &d);  //输入两个整数并分别赋值给c、d

printf("cd=%d\n", cd);  //计算c*d的值并输出

return 0;

}

输入:

  • 输入一个整数按回车连续四次;

  • 将四个变量的值一次性输入:27 30 18 10

运行结果:

a+b=57

c*d=180

输出结果说明:

  • 输入一个整数按回车:从键盘输入27,按下回车键,scanf() 就会读取输入数据并赋值给变量 a;本次输入结束,接着执行下一个 scanf() 函数,再从键盘30,按下回车键,就会将30赋值给变量 b,都是同样的道理。

  • 四个变量的值一次性输入:27 30 18 10按回车。

  • 为什么这两种方式都行呢?联系输入赋值有误吗?

从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据

如果缓冲区中的数据符合scanf()的要求,那么就读取结束

如果不符合要求,那么就继续等待用户输入,或者干脆读取失败

其实 scanf 和 printf 非常相似,只是功能相反罢了:

scanf(“%d %d”, &a, &b);  // 获取用户输入的两个整数,分别赋值给变量 a 和 b

printf(“%d %d”, a, b);  // 将变量 a 和 b 的值在显示器上输出

它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带一个&符号。&称为取地址符,也就是获取变量在内存中的地址

数据是以二进制的形式保存在内存中的,字节(Byte)是最小的可操作单位。为了便于管理,我们给每个字节分配了一个编号,使用该字节时,只要知道编号就可以。

下图是4G内存中每个字节的编号(以十六进制表示):

每个字节的编号

这个编号,就叫做地址(Address)。int a;会在内存中分配四个字节的空间,我们将第一个字节的地址称为变量 a 的地址,也就是&a的值。对于前面讲到的整数、浮点数、字符,都要使用 & 获取它们的地址,scanf 会根据地址把读取到的数据写入内存。

下面咱输出一下他们的地址:

#include <stdio.h>

int main()

{

int a=7;

int b=15;

printf(“&a=%p, &b=%p\n”, &a, &b);

return 0;

}

运行结果:

&a=0x7fffc349f32c, &b=0x7fffc349f328

输出结果说明:

这里看到的地址都是假的,是虚拟地址,并不等于数据在物理内存中的地址。虚拟地址是现代计算机因内存管理的需要才提出的概念。

输入其它数据


除了输入整数,scanf() 还可以输入单个字符、字符串、小数等。 下面咱们先看个栗子:

#include <stdio.h>

int main()

{

char name[10];

int age;

float money;

scanf(“%s”, &name);

scanf(“%d”, &age);

scanf(“%f”, &money);

printf(“我叫:%s,今年 %d,兜里有%g刀。\n”, name, age, money);

return 0;

}

输入内容:

SC 18 88.2

运行结果:

我叫:SC,今年 18,兜里有88.2刀。

输出结果说明:

  • scanf() 和 printf() 虽然功能相反,但是格式控制符是一样的,字符串、整数、小数对应的格式控制符分别是 %s、%d、%f。

  • 字符串,在[]里面要指明字符串的最大长度。

运算符

===

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。

算术运算符


下表显示了 C 语言支持的所有算术运算符。假设变量 a的值为 10,变量 b 的值为 5,则:

算术运算符

下面咱跑个实例,了解一下算术运算符:

#include <stdio.h>

int main()

{

int a = 10;

int b = 5;

int c ;

c = a + b;

printf(“1 - c 的值是 %d\n”, c );

c = a - b;

printf(“2 - c 的值是 %d\n”, c );

c = a * b;

printf(“3 - c 的值是 %d\n”, c );

c = a / b;

printf(“4 - c 的值是 %d\n”, c );

c = a % b;

printf(“5 - c 的值是 %d\n”, c );

c = a++;  // 赋值后再加 1 ,c 为 10,a 为 11

printf(“6 - c 的值是 %d a 的值是 %d\n”, c , a );

c = a–;  // 赋值后再减 1 ,c 为 11 ,a 为 10

printf(“7 - c 的值是 %d a 的值是 %d\n”, c , a );

}

运行结果:

1 - c 的值是 15

2 - c 的值是 5

3 - c 的值是 50

4 - c 的值是 2

5 - c 的值是 0

6 - c 的值是 10 a 的值是 11

7 - c 的值是 11 a 的值是 10

关系运算符


下表显示了 C 语言支持的所有关系运算符。假设变量 a 的值为 10,变量 b 的值5,则:

关系运算符

下面咱跑个实例,了解一下关系运算符:

#include <stdio.h>

int main()

{

int a = 10;

int b = 5;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!
以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。

字节高级Android经典面试题和答案


领取方法:

所有资料获取方式:评论666+点赞即可咨询资料免费领取方式!

直达领取链接:【Android高级架构师】文件夹下载!

成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-ngEwETKP-1711386640206)]
[外链图片转存中…(img-q3ei6e7s-1711386640207)]
[外链图片转存中…(img-xghqXvht-1711386640207)]
[外链图片转存中…(img-DLbHohau-1711386640208)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-0yOnSuPo-1711386640208)]

最后

我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!
以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。

字节高级Android经典面试题和答案

[外链图片转存中…(img-A4fWpHvZ-1711386640209)]
[外链图片转存中…(img-N8PdEp0Q-1711386640209)]

领取方法:

所有资料获取方式:评论666+点赞即可咨询资料免费领取方式!

直达领取链接:【Android高级架构师】文件夹下载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值