• Most vexing parse


    跟风秀一下

    #include <iostream>
    
    int g1() {
        return 10;
    }
    
    void main() {
        int f1(int()); //声明函数f1
        std::cout << f1(g1) << std::endl; //10
    
        int f2(int(*)()); //声明函数f2
        std::cout << f2(g1) << std::endl; //20
    
        int f3((int())); //定义变量f3,初始值是int()即0
        //std::cout << f3(g1) << std::endl;//编译不过
        std::cout << f3 << std::endl; //0
    
        int f4{ int() }; //定义变量f4,初始值是int()即0
        //std::cout << f4(g1) << std::endl;//编译不过
        std::cout << f4 << std::endl; //0
    
        system("pause");
    }
    
    int f1(int g()) {
        return g();
    }
    
    int f2(int(*g)()) {
        return 2 * g();
    }
    
    int f3(int g()) {
        return 3 * g();
    }
    
    int f4(int g()) {
        return 4 * g();
    }

    为什么f1是函数声明,而不是变量定义?

    两个声明都是符合语法规则的。

    而作为编译器,在解析时,遵循“max munch”。

    如果当作变量定义,显然先解析int()是一个变量,再解析f3是一个变量

    而当作函数声明,则是整个表达式

    因此f1是一个函数声明

    为什么f3是变量定义而不是函数声明?

    如果f3是一个函数,那么参数可以省掉变量名却不能省掉变量类型

    ()是一个表达式,返回一个值,显然缺少变量类型,解析为函数在语法上就不正确

  • 相关阅读:
    sublime显示当前文件的编码格式
    关于jquery中html()、text()、val()的区别
    bit,Byte,B,KB,MB,GB
    python之序列操作
    编程常用密匙
    js数组操作
    ob函数的使用
    php使用zlib实现gzip压缩
    js兼容性汇总
    centos7下源码编译安装mysql5.7
  • 原文地址:https://www.cnblogs.com/sqxy110/p/5072283.html
Copyright © 2020-2023  润新知