本系列是为了应对敝校C++考试帮同学辅导,而写。所有内容仅涉及C++基本语法,加之我并不擅长C++(ps: 准备以后将java作为发展方向 :) .)而且长期只是 C with STL 选手,所以所写均很简单。不过好在考试仅考语法,语法这东西就像说明书,其实用到的时候再学也是不会影响程序设计的。
这不是c++程序设计,而是简单的c++语法总结……
使用前请保证:
目标: 80+
本节目录
#include
using namespace std;
int main(){
// c++ io 流式输出
cout << "hello, world!" << endl;
return 0;
}
对比C语言,其实没改多少东西,无非就是将头文件stdio.h> 改成了 iostream,printf,换成了cout,接下来我们就来简单解读这个c++程序
程序第1行
#include
是c++输入输出(input,output, 缩写IO)流的头文件,当然C语言的头文件在c++里并没有失效,你可以直接使用stdio.h
然后就能用printf
了,不过这种c-style的头文件,c++里推荐的使用方法是转为
, 即在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
最后我们来谈谈这个第3行的名字空间(namespace), 你可以理解为是在某个文件中定义的一堆东西,你要使用那堆东西时必须要指明(告诉编译器大婶)那堆东西在哪里,所以第3行using namespace std
, 就相当于告诉编译器你要使用标准库中的变量(e.g.: cout/cin), 你可以试一下,如果去掉 using namespace std
编译器大婶就会发出错误了。当然更好的做法是在使用变量前指明名字空间而不是全部加入,比如你可以删掉第3行,在cout前加std::
,即
#include
//using namespace std;
int main(){
// c++ io 流式输出
std::cout << "hello, world!" << std::endl;
return 0;
}
你可以编译试试,学习语法就是不断和编译器打交道的过程
好,至此你可以说你已经会c++了(滑稽),主要是将c语言改动以下3点:
接下来我们简单回顾重要C语言语法
一般来说高校都会考运算符重载,所以搞清楚运算符会会在运算符重载时更简单,主要有两点:
除了 +,-,*,/,% 之外,还有
++ : 自增运算符,两个区别(a++,++a),a++:表达式的值是加之前的,但a的值已被增加,++a,表达式的值和a都被增加,后面有代码
–:同理
#include
using namespace std;
int main(){
std::cout << "hello, world!++/--" << std::endl;
int a = 2018;
cout <<"(a++)的值为 "<< (a++)<cout << "a++的值为 "<< a<2018;
cout <<"++a的值为" <<(++a)<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
#include
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
#include
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++考试(二) : 函数