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,就正确了。

  • 相关阅读:
    获取Web打印的实际打印次数
    Web打印的在线设计
    上海交易所的STEP/FIX/FAST协议解析
    回忆我的姑妈
    指定Web打印的打印机
    Web打印控件设计
    最终用户在线设计和修改Web报表
    NOIP2021 游记
    gym103427 部分题解
    gym103428 部分题解
  • 原文地址:https://www.cnblogs.com/shuada/p/3483463.html
Copyright © 2011-2022 走看看