精华内容
下载资源
问答
  • c语言宏定义的连接符##和#转字符串

    千次阅读 2012-08-13 17:57:43
    ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...

                              c语言宏定义的连接符##和#转字符串

    c语言宏定义的连接符有哪些

    [此问题的推荐答案]

    (一)宏定义中的## 连接符与# 符 

    ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。 

    假设程序中已经定义了这样一个带参数的宏: 

    #define paster( n ) printf( "token" #n " = %d", token##n ) 

    同时又定义了一个整形变量: 

    int token9 = 9; 

    现在在主程序中以下面的方式调用这个宏: 

    paster( 9 ); 

    那么在编译时,上面的这句话被扩展为: 

    printf( "token" "9" " = %d", token9 ); 

    注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。 

    可想而知,上面程序运行的结果就是在屏幕上打印出token9=9 

     

    (二)"/"与一个较长占多行的宏 

    宏定义中允许包含两行以上命令的情形,此时必须在最右边加上"/"且该行"/"后不能再有任何字符,连注释部分都不能有,下面的每行最后的一定要是"/","/"后面加一个空格都会报错,更不能跟注释。 

    #define exchange(a,b) {/ 

    int t;/ 

    t=a;/ 

    a=b;/ 

    b=t;/ 

    }

     

     

    经常使用_T()宏,它是怎么来的?用VA看了一下,原来_T是__T

     

    #define _T(x)       __T(x)

     

    再看看__T

     

    在tchar.h中

     

    #ifdef  _UNICODE

     

    #define __T(x)      L ## x

    #else


    #define __T(x)      x

     

    #endif

    那么,这个##是什么呢?原来它是一个连接符,将##左右两边的表达式连接成一个.比如,在_UNICODE环境下,

     

    _T(“Unicode“) == L“Unicode“

     

     

     

    不过需要注意的是,宏是由编译器在编译阶段识别的,所以不能指望程序运行时起到连接作用.比如:

     

    int A0, A1, A2, A3;

     

    for (int i = 0; i < 4; i++)

     

    {

     

     A##i = i;

     

    }

     

    这种代码就无法编译了.

    展开全文
  • java允许使用+号拼接两个字符串, 当一个字符串和一个非字符串进行拼接市,后者会转换为字符串,如果后者是对象,则会调用它的toString方法,这种情况常出现打印语句中 如需要多个字符串以特定分隔符连接起来,...

    从概念上讲,java字符串就是Unicode字符序列。例如字符串"java\u2122"由5个Unicode字符j,a,v,a和™组成。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,叫做String。每个由""括起来的字符串都是String类的实例。

    拼接字符串

    java允许使用+号拼接两个字符串,
    当一个字符串和一个非字符串进行拼接市,后者会转换为字符串,如果后者是对象,则会调用它的toString方法,这种情况常出现在打印语句中
    如需要将多个字符串以特定分隔符连接起来,可使用String类的静态方法join

    //第一个参数是分隔符,后面的是要拼接的字符串
    String all = String.join(",","a","b","c")
    

    上述代码中的all的值为"a,b,c"

    字符串的不变性

    在java中,字符串是不可修改的,字符串的修改操作将会创建新串。这是因为,java语言的设计者认为,字符串的共享将会带来高效率。

    各种字符串将会被存放到一个公共的存储池中。字符串变量指向存储池中的相应位置(字符串变量的值为地址),两个字面量相等的字符串变量,指向相同的地址
    示例:

    public static void main(String[] args) {
            String s1 = "abc";
            String s2 = "abc";
    
            String a = "ab";
            String b = "c";
            String s3 = a+b;
            
            System.out.println(s1==s2);
            System.out.println(s1==s3);
        }
    

    结果:
    在这里插入图片描述
    注意:只有字符串字面量是共享的,而通过+或subString得到的字符串并不共享

    检测字符串是否相等

    在c++中,c++的String类重载了==操作符来检测两个字符串内容是否相等,但是java没有运算符重载机制,只能使用equals方法或compareTo方法来检验字符串内容的相等性。

    码点与代码单元

    码点:码点是指某个字符在编码表上对应的数值
    代码单元:代码单元是组成码点的更小单位,对于绝大多数常用字符,一个码点由一个代码单元构成,而对于一些辅助字符,其码点由两个代码单元构成

    java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示的Unicode码点的代码单元。最常用的Unicode字符使用一个代码单元就可以表示,而辅助字符需要使用两个代码单元表示。

    String类的length方法返回的是采用UTF-16编码表示的字符串所需要的代码单元数量,而不是指字符串的字符个数(即当字符串中含有辅助字符时,length方法的返回值要比字符串中的字符个数大)。

    若想得到实际的长度,即码点数量,可以使用String类的codePointCount方法

    大多数情况下,字符串中不会含有辅助字符,因而以上两种获得字符串长度的方法均可用。

    需要注意的是,虚拟机不一定把字符串实现为代码单元序列。在java9中,只包含单字节代码单元的字符串使用byte数组实现,所有其他字符串均使用char数组

    构建字符串

    如果需要多次拼接字符串,建议使用StringBuilder或StringBuffer,避免多次创建String对象,造成内存空间的浪费。

    StringBuilder builder = new StringBuilder();
    builder.append("abc");
    builder.append("def");
    
    String result = builder.toString()  //result="abcdef"
    

    需要注意的是,StringBuffer是线程安全的,它支持在多个线程中并发编辑字符串,但是代价是降低效率。而StringBuilder不是线程安全的,它只支持在单线程内编辑字符串,但是效率较高。两者的API是一样的

    对于其他的字符串常用API本文不再赘述,详情参见官方文档

    展开全文
  • 这## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...

    宏定义中的## 连接符与# 符

    .这## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的

    假设程序中已经定义了这样一个带参数的宏:
    #define paster( n ) printf( “token” #n " = %d", token##n )

    同时又定义了一个整形变量:
    int token9 = 9;

    现在在主程序中以下面的方式调用这个宏:
    paster( 9 );

    那么在编译时,上面的这句话被扩展为:
    printf( “token” “9” " = %d", token9 );

    注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
    可想而知,上面程序运行的结果就是在屏幕上打印出token9=9

    不过需要注意的是,宏是由编译器在编译阶段识别的,所以不能指望程序运行时起到连接作用.比如:
    int A0, A1, A2, A3;

    for (int i = 0; i < 4; i++)

    {
    A##i = i;

    }

    这种代码就无法编译了.

    展开全文
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...

    连接符 ##(两个井号)

    不知道什么符 #(一个井号)

    ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释

    #符是把传递过来的参数当成字符串进行替代。

    假设程序中已经定义了这样一个带参数的宏:

    #define PRINT( n ) printf( "token" #n " = %d", token##n )

    同时又定义了二个整形变量:

    int token9 = 9;

    现在在主程序中以下面的方式调用这个宏:

    PRINT( 9 );

    那么在编译时,上面的这句话被扩展为:

    printf( "token" "9" " = %d", token9 );

    注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。

    可想而知,上面程序运行的结果就是在屏幕上打印出token9=9

    还有点不明白?!

    再来一个例子:

    #define PRINT( n ) printf( "token" #n " = %d", game##n )

    int token9 = 9;

    int game9 = 99;

    调用:

    PRINT(9);

    屏幕上打印出:

            token9 = 99;

    转载于:https://www.cnblogs.com/vanishfan/p/3417572.html

    展开全文
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可 以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • c语言中 ## 连接符与# 符

    千次阅读 2012-10-26 21:06:01
    ##连接符号,用带参数的宏定义中将两个子串编译时候联接起来组成一个新的字串。但是不可以把##符放在字串最前面或最后面,#符是把传过来的参数当成字符串进行替代。其中的参数都不能是变量。如下例子: ...
  • C语言连接符号##和#解析

    千次阅读 2011-12-07 23:26:29
    ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...
  • 原生js中,有3种基本的数据类型和2种特殊的类型,对于初学者来说,...当 运算符是 + 时,只要有一个操作数是字符串,那么就会把另外一个操作数隐式转换为字符串,然后将两个字符串连接起来组成一个新的字符串 alert
  • ## 连接符号由两个井号组成,其功能是带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所 谓的子串(token)就是指编译器能够识别的最小语法单元。具体的...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

在将两个字符串连接起来组成一个