应对高校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!

#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++考试(二) : 函数

猜你喜欢

转载自blog.csdn.net/dylan_frank/article/details/80562128