单目操作符与第 2 章 C/C++输⼊输出(上)
- [8. 单⽬操作符](#8. 单⽬操作符)
-
- [8.1 ++和--](#8.1 ++和--)
-
- [8.1.1 前置++ 和 后置++](#8.1.1 前置++ 和 后置++)
- [8.1.2 前置-- 和 后置--](#8.1.2 前置-- 和 后置--)
- [8.2 + 和 -](#8.2 + 和 -)
- [第 2 章 C/C++输⼊输出(上)](#第 2 章 C/C++输⼊输出(上))
- [1. getchar 和 putchar](#1. getchar 和 putchar)
-
- [1.1 getchar()](#1.1 getchar())
- [1.2 putchar()](#1.2 putchar())
- [2. scanf 和 printf](#2. scanf 和 printf)
-
- [2.1 printf](#2.1 printf)
-
- [2.1.1 基本⽤法](#2.1.1 基本⽤法)
- [2.1.2 占位符](#2.1.2 占位符)
- [2.1.3 格式化输出](#2.1.3 格式化输出)
-
- [2.1.3.1 限定宽度](#2.1.3.1 限定宽度)
- [2.1.3.2 限定⼩数位数](#2.1.3.2 限定⼩数位数)
8. 单⽬操作符
前⾯介绍的操作符都是双⽬操作符,即有2个操作数。除此之外还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。如 ++、--、+(正)、-(负) 就是单⽬操作符。
8.1 ++和--
++ 是⼀种⾃增的操作符,⼜分为前置 ++ 和后置 ++ , -- 是⼀种⾃减的操作符,也分为前置 --
和后置 --
请⼀定要注意:
• 前置 ++ 或者 后置 ++ ,都是让操作数⾃增1的
• 前置 -- 或者 后置 -- ,都是让操作数⾃减1的
8.1.1 前置++ 和 后置++
cpp
//案例1
int x = 10;
int a = ++x;//++的操作数是x,是放在x的前⾯的,就是前置++
cout << x << " " << a << endl;
//案例2
int x = 10;
int a = x++;//++的操作数是x,是放在x的后⾯的,就是后置++
cout << x << " " << a << endl;
⼩技巧:
前置++: 先+1,后使⽤
后置++:先使⽤,后+1
8.1.2 前置-- 和 后置--
cpp
//案例1
int y = 10;
int b = --y;//--的操作数是y,是放在y的前⾯的,就是前置--
cout << y << " " << b << endl;
//案例2
int y = 10;
int b = y--;//--的操作数是y,是放在y的后⾯的,就是后置--
cout << y << " " << b << endl;
⼩技巧:
前置 --: 先 - 1,后使⽤
后置 --:先使⽤,后 - 1
8.2 + 和 -
这⾥的 + 是正号, - 是负号,都是单⽬操作符。
运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
cpp
int a = +10; //等价于 int a = 10;
运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负
数
cpp
int a = 10;
int b = -a;
int c = -10;
cout << b << c << endl;//这⾥的b和c都是-10
int a = -10;
int b = -a;
cout << b << endl;//这⾥的b是10
第 2 章 C/C++输⼊输出(上)
1. getchar 和 putchar
getchar() 和 putchar() 是属于 C 语⾔的库函数,C++是兼容 C 语⾔的,所以 C++ 中只要正确包
含头⽂件也可以正常使⽤这两个函数。
1.1 getchar()
函数原型如下:
int getchar ( void );
getchar() 函数返回⽤⼾从键盘输⼊的⼀个字符,使⽤时不带有任何参数。
程序运⾏到这个命令就会暂停,等待⽤⼾从键盘输⼊,等同于使⽤ cin 或 scanf() ⽅法读取⼀个字
符。
它的原型定义在头⽂件 。
cpp
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int ch;
ch = getchar();
cout << ch << endl;
cout << (char)ch << endl;
return 0;
}
getchar() 不会忽略起⾸的空⽩字符,总是返回当前读取的第⼀个字符,⽆论是否为空格。
如果读取失败,返回常量 EOF ,由于 EOF 通常是 -1 ,所以返回值的类型要设为 int ,⽽不是
char 。
如何让 getchar() 函数读取失败,返回 -1 呢?其实需要在输⼊字符之前,直接按 Ctrl+z 就可
以。
cpp
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int ch;
ch = getchar();
cout << ch << endl;
return 0;
}
getchar() 通常和 putchar() 是⼀对⼉,配合使⽤的。
1.2 putchar()
int putchar( int character );
putchar() 函数将它的参数字符输出到屏幕,它的原型定义在头⽂件 。
cpp
#include <cstdio>
int main()
{
int ch = 0;
ch = getchar();
putchar(ch);
return 0;
}
操作成功时, putchar() 返回输出的字符,否则返回常量 EOF 。
⼩提⽰:
这⾥⼤家先学会这两个函数的使⽤,在后期算法课的模块,会学到快速读写,到时候就会⽤
到这两个函数。
2. scanf 和 printf
scanf() 和 printf() 是属于C语⾔的库函数,C++是兼容 C 语⾔的,所以 C++ 中只要正确包含头
⽂件也可以正常使⽤这两个函数。⽽且这两个函数在算法竞赛题⽬中使⽤的⾮常频繁,尤其是在输出
格式控制中,所以接下来我们这⾥认真学习⼀下。
2.1 printf
printf() 函数原型如下:
int printf ( const char * format, ... );
2.1.1 基本⽤法
printf() 的作⽤是将参数⽂本输出到屏幕。
它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
cpp
#include <cstdio>
int main()
{
printf("Hello World");
return 0;
}
上⾯命令会在屏幕上输出⼀⾏⽂字"Hello World"。
printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换
⾏。
为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。
如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,如下⽅代码:
c
#include <cstdio>
int main()
{
printf("Hello\nWorld\n");
printf("Hello\n");
printf("World\n");
return 0;
}
2.1.2 占位符
printf() 可以在输出⽂本中指定占位符。
所谓 "占位符",就是这个位置可以⽤其他值代⼊。
cpp
#include <cstdio>
// 输出 There are 3 apples
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要
⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这
⾥代⼊的值必须是⼀个整数。
printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果
就是 There are 3 apples 。
常⽤的占位符除了 %d ,还有 %s 表⽰代⼊的是字符串。
cpp
#include <cstdio>
int main()
{
printf("%s will come tonight\n", "zhangsan");
return 0;
}
上⾯⽰例中, %s 表⽰代⼊的是⼀个字符串,所以 printf() 的第⼆个参数就必须是字符串,这个例
⼦是 zhangsan 。执⾏后的输出就是 zhangsan will come tonight 。
输出⽂本⾥⾯可以使⽤多个占位符。
cpp
#include <cstdio>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21);
return 0;
}
上⾯⽰例中,输出⽂本 %s says it is %d o'clock 有两个占位符,第⼀个是字符串占位
符 %s ,第⼆个是整数占位符 %d ,分别对应 printf() 的第⼆个参数( lisi )和第三个参数
( 21 )。执⾏后的输出就是 lisi says it is 21 o'clock 。
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n +
1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。
占位符列举:
printf() 的占位符有许多种类,与数据类型相对应。
下⾯列出常⽤的占位符,⽅便查找,具体含义在后⾯章节介绍。
占位符
介绍
%d ⼗进制整数。
%lld ⼗进制 long long int 类型。
%f ⼩数(包含float类型和double类型)。
%Lf long double 类型浮点数。
%c 字符。
%s 字符串。
%a ⼗六进制浮点数,字⺟输出为⼩写。
%A ⼗六进制浮点数,字⺟输出为⼤写。
%e 使⽤科学计数法的浮点数,指数部分的e为⼩写。
%E 使⽤科学计数法的浮点数,指数部分的E为⼤写。
%i 整数,基本等同于%d。
%g 6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的e为⼩写。
%G 等同于%g,唯⼀的区别是指数部分的E为⼤写。
%hd ⼗进制 short int 类型。
%ho ⼋进制 short int 类型。
%hx ⼗六进制 short int 类型。
%hu unsigned short int 类型。
%ld ⼗进制 long int 类型。
%lo ⼋进制 long int 类型。
%lx ⼗六进制 long int 类型。
%lu unsigned long int 类型。
%llo ⼋进制 long long int 类型。
%llx ⼗六进制 long long int 类型。
%llu unsigned long long int 类型。
%Le 科学计数法表⽰的 long double 类型浮点数。
%n 已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
%o ⼋进制整数。
%p 指针。
%u ⽆符号整数(unsigned int)。
%x ⼗六进制整数。
%zd size_t类型。
%% 输出⼀个百分号。
2.1.3 格式化输出
printf() 可以定制占位符的输出格式。
2.1.3.1 限定宽度
printf() 允许限定占位符的最⼩宽度。
cpp
#include <cstdio>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空
格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
cpp
#include <cstdio>
int main()
{
printf("%-5d\n", 123); // 输出为 "123 "
return 0;
}
上⾯⽰例中,输出内容 123 的后⾯添加了空格。
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。
cpp
#include <cstdio>
// 输出 " 123.450000"
int main()
{
printf("%12f\n", 123.45);
return 0;
}
上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位,
所以 123.45 输出结果的头部会添加2个空格
2.1.3.2 限定⼩数位数
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写
成 %.2f 。
cpp
#include <cstdio>
// 输出 Number is 0.50
int main()
{
printf("Number is %.2f\n", 0.5);
return 0;
}
上⾯⽰例中,如果希望⼩数点后⾯输出3位( 0.500 ),占位符就要写成 %.3f 。
这种写法可以与限定宽度占位符,结合使⽤。
cpp
#include <cstdio>
// 输出为 " 0.50"
int main()
{
printf("%6.2f\n", 0.5);
return 0;
}
上⾯⽰例中, %6.2f 表⽰输出字符串最⼩宽度为6,⼩数位数为2。所以,输出字符串的头部有两个
空格。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。
cpp
#include <cstdio>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
上⾯⽰例中, %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 传⼊。