高校C++考试(一) : 从C到C++"/>
应对高校C++考试(一) : 从C到C++
写在前面
本系列是为了应对敝校C++考试帮同学辅导,而写。所有内容仅涉及C++基本语法,加之我并不擅长C++(ps: 准备以后将java作为发展方向 :) .)而且长期只是 C with STL 选手,所以所写均很简单。不过好在考试仅考语法,语法这东西就像说明书,其实用到的时候再学也是不会影响程序设计的。
这不是c++程序设计,而是简单的c++语法总结……
使用前请保证:
- 已掌握基本c语言语法,输入输出,控制逻辑(e.g.: if,for)
- 已知道基本变量: char,int,long long,double,float……
- 会写基本c语言函数。
- 知道常用库函数(printf,scanf,strcmp,……)
- 会使用数组
目标: 80+
本节目录
- 写在前面
- c++的hello,world!
- 头文件
- 输入输出
- namespace 名字空间
- 运算符
- 算术运算符
- 位运算
- 比较运算
- 杂项运算符
- 作用域
c++的hello,world!
#include<iostream>using namespace std;int main(){// c++ io 流式输出cout << "hello, world!" << endl;return 0;
}
对比C语言,其实没改多少东西,无非就是将头文件stdio.h> 改成了 iostream,printf,换成了cout,接下来我们就来简单解读这个c++程序
头文件
程序第1行
#include<iostream>
是c++输入输出(input,output, 缩写IO)流的头文件,当然C语言的头文件在c++里并没有失效,你可以直接使用stdio.h
然后就能用printf
了,不过这种c-style的头文件,c++里推荐的使用方法是转为<cstdio>
, 即在c-style 头文件前面加个字母c
, 关于这两者的区别你不需要懂,主要涉及名字空间(namespace) 的概念。详细区别可以参见 stack-overflow
里的解释
cstdio stdio.h namespace
类似的还有
<cstring>//<string.h>
<cmath>//<math.h>
<cstdlib>//<stdlib.h>
输入输出
既然都谈到iostream
了就不得不谈,输入了,与cout
相对的是cin
e.g.:
char c;
std::cin>>c;//表示从标准输入流获取一个字符到c这个变量。
你可能已经注意到和cout
的一个区别了,就是>>
和<<
, 这两个是c++里面定义的两个流式符号(如果你熟悉 linux(当然你就不会再看这篇文章了:),) 你应该很熟悉这个符号), 你看箭头的方向代表数据的流向,输入是从外部(这里是标准输入 cin)输入数据到某个变量,故箭头指向变量,输出是从内部变量输出到标准输出(e.g: 那个黑框)所以箭头指向cout
namespace 名字空间
最后我们来谈谈这个第3行的名字空间(namespace), 你可以理解为是在某个文件中定义的一堆东西,你要使用那堆东西时必须要指明(告诉编译器大婶)那堆东西在哪里,所以第3行using namespace std
, 就相当于告诉编译器你要使用标准库中的变量(e.g.: cout/cin), 你可以试一下,如果去掉 using namespace std
编译器大婶就会发出错误了。当然更好的做法是在使用变量前指明名字空间而不是全部加入,比如你可以删掉第3行,在cout前加std::
,即
#include<iostream>//using namespace std;int main(){// c++ io 流式输出std::cout << "hello, world!" << std::endl;return 0;
}
你可以编译试试,学习语法就是不断和编译器打交道的过程
好,至此你可以说你已经会c++了(滑稽),主要是将c语言改动以下3点:
- 将c-style头文件前面加c
- 将输入输出换为iostream
- 使用名字空间
接下来我们简单回顾重要C语言语法
运算符
一般来说高校都会考运算符重载,所以搞清楚运算符会会在运算符重载时更简单,主要有两点:
- 优先级(其实个人认为这个很傻逼,因为加括号就能避免死记硬背优先级)
- 运算符设计几个变量(几目)
我仅挑几个重要的讲,详细内容可见C++ 运算符| 菜鸟教程 (会上网学习编程并不难:) )
算术运算符
除了 +,-,*,/,% 之外,还有
++ : 自增运算符,两个区别(a++,++a),a++:表达式的值是加之前的,但a的值已被增加,++a,表达式的值和a都被增加,后面有代码
–:同理
#include<iostream>
using namespace std;
int main(){std::cout << "hello, world!++/--" << std::endl;int a = 2018;cout <<"(a++)的值为 "<< (a++)<<endl;cout << "a++的值为 "<< a<<endl;a = 2018;cout <<"++a的值为" <<(++a)<<endl;cout <<"a的值为" << (a)<< endl;return 0;
}
输出结果
位运算
下表显示了 C++ 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
运算符 | 描述 | 实例 |
---|---|---|
& | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (A & B) 将得到 12,即为 0000 1100 |
| | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (A | B) 将得到 61,即为 0011 1101 |
^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 二进制补码运算符是一元运算符,具有”翻转”位效果,即0变成1,1变成0。 | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 15,即为 0000 1111 |
比较运算
比较运算符常考重载,需要主要都是双目运算(两个对象才能比较)
假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
杂项运算符
下表列出了 C++ 支持的其他一些重要的运算符。
运算符 | 描述 |
---|---|
sizeof | sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。 |
Condition ? X : Y | 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。 |
, | 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 |
.(点)和 ->(箭头) | 成员运算符用于引用类、结构和共用体的成员。 |
typeid | 返回对象的类型 |
& | 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。 |
* | 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。 |
#include<iostream>
#include<typeinfo>
using namespace std;
int main(){cout <<"----sizeof operator ----- xx Byte\n";cout << "sizeof(int) " << sizeof(int) << "\n"<< "sizeof(char) " << sizeof(char)<<"\n"<<"sizeof(double) "<< sizeof(double) <<"\n";cout <<"----typeid operator ----- \n";int a;char b;double c;cout << "typeid(a) " << typeid(a).name() <<"\n"<<"typeid(b) " << typeid(b).name() <<"\n"<<"typeid(c) " << typeid(c).name() <<"\n"<<"typeid(int) " <<typeid(int).name() <<"\n";return 0;
}
就讲这些了,这里应该对应看看敝校老师出的公众号考题,了解烦人的 ++,–(虽然在工程中根本不需要搞n多个++/–那么复杂,但作为备考,看看还是有必要的).
作用域
最后讲一下变量作用域的概念。
所谓作用域就是变量只能在某一段代码块中被访问,也就是你得分清: 全局变量/局部变量。看下面一个程序。
#include<iostream>
#include<typeinfo>
using namespace std;int maxn = 8;
int main(){for(int i=0 ; i < maxn ; ++i){cout << i << " 你可以访问i " << maxn<<" 你也能访问maxn \n";break;}// cout << i<<"\n";//编译出错{int n = 5;}// cout << n<<"\n"; //编译出错return 0;
}
你可以看到我注释掉的两行都是错误的,因为i
,和n
都是被特定代码块{...}
包围的局部变量,在代码块外部就不能访问了。一般来说,控制逻辑 if,for,while
以及函数都会分出代码块,即里面的变量外面不能访问,也就不存在变量重定义一说了
我们下一节讲 c++ 里面的某些特殊函数
应对高校C++考试(二) : 函数
更多推荐
应对高校C++考试(一) : 从C到C++
发布评论