zoukankan      html  css  js  c++  java
  • 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是一个函数,那么参数可以省掉变量名却不能省掉变量类型

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

  • 相关阅读:
    centos7 安装mysql
    Nginx安装及配置详解
    nginx安装
    JSON Web Token
    优先队列
    小程序遮罩层禁止页面滚动(遮罩层内部可以滚动)
    H5中接入微信支付
    如何使用less预编译
    在methods中使用filter
    根据当前时间获取上一个月的时间
  • 原文地址:https://www.cnblogs.com/sqxy110/p/5072283.html
Copyright © 2011-2022 走看看