• 【学习笔记】C/C++


    1. C语言中的 scanf() 函数

    该函数包含在头文件 <stdio.h> 或者 <cstdio> (在C++中使用时)

    函数的返回值指的是

    所输入的数据与格式字符串匹配的次数。

    意思就是该函数返回已成功赋值的数据项数,出错时返回 EOF (End_of_File,是一个预定义常量,表示文件末尾,值为-1)

    简单示例:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     int a, b;
     6     int input = scanf("%d %d", &a, &b);
     7     printf("input = %d
    ", input);
     8     
     9     return 0;
    10 }

    此时输入 1 2 

    得到输出 input = 2 

    上述结果表示正确匹配,若出现错误,如输入 1 a 

    第二个值匹配失败,整型变量b无法得到字符‘a’,依旧是一个未赋值前不确定的值,则此时输出结果为 input = 1 

    总之,我们可通过函数scanf( )返回值,来检测输入格式的正确性。

    2. C++类与对象

    2.1 问题:我们需要将一个类的所有实例都保存在一个容器中,同时又不需要类的使用者进行其他的操作,该如何实现?

    方法:在类中定义一个static类型的容器作为类的成员变量,构造对象时将对象的地址添加到容器中,析构时再将其从容器中删除。

     1 #include <iostream>
     2 #include <list>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 class MyClass {
     8 protected:
     9    int value_;
    10 public:
    11    static list<MyClass*> instances_;
    12    MyClass(int val);
    13   ~MyClass();
    14    static void showList();
    15 };
    16 
    17 list<MyClass*> MyClass::instances_;
    18 
    19 MyClass::MyClass(int val) {
    20    instances_.push_back(this);
    21    value_ = val;
    22 }
    23 
    24 MyClass::~MyClass() {
    25    list<MyClass*>::iterator p =
    26       find(instances_.begin(), instances_.end(), this);
    27    if (p != instances_.end())
    28       instances_.erase(p);
    29 }
    30 
    31 void MyClass::showList() {
    32    for (list<MyClass*>::iterator p = instances_.begin();
    33         p != instances_.end(); ++p)
    34       cout << (*p)->value_ << endl;
    35 }
    36 
    37 int main(int argc, char **argv) {
    38    MyClass a(1);
    39    MyClass b(10);
    40    MyClass c(100);
    41    MyClass::showList();    // 输出的结果为1,10,100
    42    return 0;  
    43 }

    3. 生成随机数序列

    3.1 C语言中 rand() 函数用来产生随机数,但这不是真正意义上的随机数,是伪随机数。

    它是以一个数(通常称为种子)为基准推算出来的一系列数,当这系列数很大时,就会服从正态公布,从而相当于产生了随机数。

    当计算机正常开机后,这个种子的值是定了的,除非你破坏系统,才能改变这个种子的值。

    C++提供了 std::srand() 函数,其原型是 void srand( int a) ,利用 srand((unsigned int) (time(NULL)) 是一种产生不可预见的随机序列的方法,因为每一次运行程序的时间是不同的。

    3.2 以当前时间为参数重置随机数种子

    如果没调用 srand() ,你会发现你每次运行程序, rand() 得到的序列值是不变的,然后 srand 里参数相同时 rand() 得到的序列也将相同。

    std::srand(time(0)) 的作用就是让得到的序列看上去更贴近随机的概念。

    等有空把遇到的错误和更标准的方法总结一下。

    4. Lambda表达式

    为何使用 Lambda ?

    4.1 距离

    很多人认为,让定义位于使用的附近很有用。这样就无需翻阅很多源代码,以了解函数。修改代码也很简单。

    Lambda 表达式是不错的选择,而函数是不好的选择,因为不能内部定义其他函数,定义可能离使用的地方很远。函数符是个不错的选择,可以在函数内部定义类(包含函数符类)。

    4.2 简洁

    函数符代码要比l Lambda 代码更加繁琐,函数和 Lambda 的简洁程度相当。

    4.3 效率

    三种方法相对效率取决于编译器的内联。函数指针阻止了内联,因为编译器传统上不会内联其他地址被获取的函数,因为函数地址的概念意味着非内联函数。而函数符和 Lambda 通常不会阻止内联。

    4.4 功能

    Lambda 表达式可访问作用域内的任何动态变量,可以采用取值、引用的形式进行捕获。

    参考资料

    [1] c++随机数生成 http://blog.sina.com.cn/s/blog_79ab4be10100uzrj.html

    [2] C++产生随机数一直重复的问题 https://www.csdn.net/gather_22/MtzakgzsMTUtYmxvZwO0O0OO0O0O.html

  • 相关阅读:
    [IDA] 显示反汇编字节码
    使用OD手动去除花指令的一个小技巧
    [CrackMe]一个简单算法的CrackMe
    [IDA] 将ANSI字符串转换为Unicode字符串
    二进制中的数学换算
    GDT表与段描述符
    C#3.0新增功能10 表达式树 04 执行表达式
    C#3.0新增功能10 表达式树 03 支持表达式树的框架类型
    C#3.0新增功能10 表达式树 02 说明
    C#3.0新增功能10 表达式树 01 简介
  • 原文地址:https://www.cnblogs.com/phillee/p/10647808.html
Copyright © 2020-2023  润新知