zoukankan      html  css  js  c++  java
  • 还记得 C中带参宏的 "#"号吗?

    在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号

    而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。 -- 引用自http://blog.csdn.net/acs713/article/details/6891837 (C语言宏与单井号(#)和双井号(##))

      

      今天暂时不说 ##,而是重新认识一下 #运算符,代码如下:

     1 #include <stdio.h>
     2 
     3 
     4 #define Test_OPERATOR_1(arg) printf("这里是测试:参数为 "#arg"。
    ")
     5 #define Test_OPERATOR_2(arg) printf("这里是测试:输出数据为 "#arg"
    ")
     6 
     7 int main(void)
     8 {
     9     Test_OPERATOR_1(Aha);
    10     Test_OPERATOR_2(124);
    11 
    12     return 0;
    13 }

    这里的原因不用多说,但是刚刚我好像写错了,将第 5行写成下面这个样子的了;这种写法好像没见过。。。。

     1 #define Test_OPERATOR_2(arg) printf("这里是测试:输出数据为 %d ",#arg) 

    这时候的输出为

    咦,这里是什么数据? 将第五行再改下,把参数前面的 #去掉试试。输出同第一个图。

    现在想想修改之前的输出,也就是使用 #define Test_OPERATOR_2(arg) printf("这里是测试:输出数据为 %d ",#arg)这行代码时。

    把参数改一下,嗯~~改成 5试一下吧

    貌似和上面的图输出一样,这是什么原因?难道输出的是地址?改成地址格式输出试试

    转成十进制,还是 4206653,奇了怪了,怎么一直输出一个数据呢?

    是地址?在输出数据前加个 *在已十进制输出试试,第五行代码修改如下

     1 #define Test_OPERATOR_2(arg) printf("这里是测试:输出数据为 %d ",*#arg) 

    这时的输出 53

    这个数字好像很熟悉,,,不就是 5对应的 ASCII码吗?

    在换个参数试试~~  A

    65!!!又经过几次测试,单字符时输出果然是其对应数字的 ASCII码

    可是如果一个两位数会怎样?选个 59吧

    咦,又输出 53? 换个 53试试 (⊙_⊙)(⊙_⊙)

    还是 53(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)怎么回事?

    再换个,,,35,输出 51

    怪了,再换、

    30 --> 51

    280 --> 50

    70545 --> 55

    856 --> 56

    1234 --> 49

    9876 --> 57

    ...

    好像发现了什么 (⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)

    换字母试试

    aa -->97

    ae --> 97

    be--> 98

    hgjhyh --> 104

    mjrte5r4 --> 109

    已疯...

    貌似真的发现了什么(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)

    真的都是首位数字的 ASCII码。。。。

    这样的话,,,如果这样写:

    #define Test_OPERATOR_RETURN(arg)  *#arg

    get的也就是参数中第一个字符的 ASCII码了,试了下果真如此。

    但是,,,加 *之前输出的是什么怪东西?真的是地址?

     1 #define Test_OPERATOR_1(arg) printf("这里是测试:参数为 "#arg"。
    ")
     2 #define Test_OPERATOR_2(arg) printf("这里是测试:输出数据为 %d
    ",#arg)
     3 
     4 #define Test_OPERATOR_RETURN(arg) #arg
     5 
     6 int main(void)
     7 {
     8     Test_OPERATOR_1(Aha);
     9     Test_OPERATOR_2(A);
    10     Test_OPERATOR_2(A);
    11 
    12     return 0;
    13 }

    这样再试试,输出如下:

    一样的?释放了又重新分配的?

    再改下:

     1 #define Test_OPERATOR_1(arg) printf("这里是测试 1:参数为 "#arg"。
    ")
     2 #define Test_OPERATOR_2(arg1, arg2) 
     3 printf("这里是测试 2:
    参数 1输出数据为 %d
    
     4 参数 2输出的数据为 %d",#arg1, #arg2)
     5 
     6 #define Test_OPERATOR_RETURN(arg) #arg
     7 
     8 int main(void)
     9 {
    10     Test_OPERATOR_1(Aha);
    11     Test_OPERATOR_2(A,A);
    12 
    13     return 0;
    14 }

    输出如下:

    稍微变了下,但是,,,还是怎么还是一样的 T_T,这是到底是什么个东西。。。T_T 

    。。。

    。。。

    难道说?

    #号相当于 &的作用?

    那再试试将 #换成 &,,,报错。。。。。。

     1 #define Test_OPERATOR_1(arg) printf("这里是测试 1:参数为 "#arg"。
    ")
     2 #define Test_OPERATOR_2(arg) 
     3 printf("这里是测试 2:
    参数输出数据为 %d
    ",
     4 *#arg)
     5 
     6 #define Test_OPERATOR_RETURN(arg) #arg
     7 
     8 int test_arg = 128;
     9 
    10 int main(void)
    11 {
    12     Test_OPERATOR_1(Aha);
    13     Test_OPERATOR_2(test_arg);
    14 
    15     return 0;
    16 }

    定义了个变量,本来想看看输出个什么玩意儿来着,结果。。。还是 ASCII码 T_T

  • 相关阅读:
    python面试的100题(12)
    python面试的100题(11)
    python面试的100题(10)
    python面试的100题(9)
    python面试的100题(8)
    python面试的100题(7)
    纯js做鼠标拖拽物体并记录鼠标位置的效果(附pageX clientX offsetX screenX的区别图)
    利用function函数做一个简易计算器(getElementById)
    JavaScript中的函数function
    初识JavaScript
  • 原文地址:https://www.cnblogs.com/Danhuise/p/3788340.html
Copyright © 2011-2022 走看看