zoukankan      html  css  js  c++  java
  • 一道有关#define的题

    题目是:查看以下代码,问结果是什么?

    结果是打印出“array:16345678910”吗?

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    #define SUB(x,y) x-y
    #define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =value
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int i;
        ACCESS_BEFORE(array[5], 4, 6);
        printf("array: ");
        for (i = 0; i<10; ++i){
            printf("%d", array[i]);
        }
        printf("
    ");
        return 0;
    }

    #define其实是简单的替换,这里先把ACCESS_BEFORE(array[5], 4, 6)替换成:

    *SUB(&array[5],4)=6,再利用SUB的定义,最终被替换成:

    *&array[5]-4=6。*&array[5]就是array[5],代入值即为6-4=6,编译器报“左值”相关错误,这里左值是常量2,不可赋值。

    有趣的地方是,由于思维定势,人们会将*SUB(&array[5],4)=6替换为*(&array[5]-4)=6。由于#define只是简单的替换,所以这个圆括号是实际不存在的。

    把原代码中的#define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =value修改为:

    #define ACCESS_BEFORE(element,offset,value) *(SUB(&element, offset)) =value,就正确了。

  • 相关阅读:
    logback配置和使用
    安装多个jdk导致eclipse打不开问题
    Spring事务管理
    使用JavaConfig配置SpringMVC
    Spring pom.xml配置
    Maven私服搭建(Nexus Repository Manager 3)
    Maven多环境配置
    Maven多模块构建实例
    Maven依赖机制
    Maven安装与配置
  • 原文地址:https://www.cnblogs.com/shuada/p/3483463.html
Copyright © 2011-2022 走看看