c/c++语言开发共享格式字符串参数后“+1”对printf()的影响

我有一些与此代码相关的问题。 printf的参数是const char*...类型(可变参数列表)。

1)为什么程序的输出是d而不是127
2)是否将+1转换为字符串并传递给const char*类型的参数变量?

 #include int main() { printf("%d"+1 , 127); //how this will get executed? return 0; } 

输出:

 d 

    第一个参数是指向char的指针。
    文字"%d"将是指向'%'的指针,其后面隐含着'd''' 。 它是一个指向char的指针,因为它是字符串文字的C表示:末尾带有''的字符序列; 表示用作参数等作为char的指针。
    但根据指针算法, "%d"+1是指向'd'的指针,后跟''
    两者都是零终止的,因为它适合printf的参数。

    所以输出是一样的

     printf("d", ignored); 

    127变为“忽略”,即它被忽略,因为"d"告诉printf不要期望任何东西,因为它没有任何特殊的字符序列,例如“%someletter”。 所以它不会期望,不会寻找任何东西,也不会在它认为给出的完全正常的字符串之外进行任何打印。
    但请注意,其他参数(格式字符串中未包含的参数)会被评估然后被忽略。 这是相关的,因为该评估的任何副作用(例如函数调用)实际上都会发生。
    详情请参见此处:

    让我试着帮助并添加@Yunnosch的答案,你可以做到以下几点:

      char *str = "%d"; printf (str, 127); 

    和输出应该是:

     127 

    在上面的例子中, str就像这样存储在内存中(这只是一个例子,现实生活中的地址就像0xabcdef12345678):

     address | memory --------+-------------- 0 | % 1 | d 3 |  

    所以str指向地址0 (或你的系统上的等价物),它持有%printf()获取该地址并从那里开始读取,读取直到它遇到NULL字符’ 0’。 现在,每当它看到%它会查找下一个字符dcx等,它会从参数列表中读取下一个参数。 如果你提供d它将输出十进制,如果你提供c它将打印字符, x是hex,还有更多。 因此printf()将读取所有字符并用适当的参数替换% ,直到它遇到NULL字符 ,但它将从提供的地址开始。

    你的情况:

     printf("%d"+1, 127); 

    与:

     char *str = "%d"; printf (str + 1, 127); // printf receives address of character `d` as starting point 

    或者它类似于

     char *str = "%d"; char *str1 = str+1; // increment the address of string by one printf (str1, 127) 

    在这两种情况下,它接收d地址并从那里读取,直到它达到

    如果你这样做:

     printf ("%d" + 2, 127); 

    这将是:

     char *str = "%d"; printf (str + 2, 127); 

    它会输出任何内容,因为printf()将获得的地址。 正如@Yunnosh所说, 127会被忽略。

    因此+1+2不会转换为字符串,而是添加到字符串的地址中。

    我希望这有帮助,我想我回答了你的两个问题。

      以上就是c/c++开发分享格式字符串参数后“+1”对printf()的影响相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562485.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐