【问题标题】:What does each element of printf's #%ld!\n mean?printf 的 #%ld!\n 的每个元素是什么意思?
【发布时间】:2017-08-30 08:00:12
【问题描述】:
 void* PrintHello(void *threadid)
 {
      long tid;
      tid =(long)threadid;
      printf("Hello World! It's me, thread #%ld!\n",tid);
      pthread_exit(NULL);
 }

我想知道变量声明的每个元素代表什么,是否有更简单的方法(更具可读性/类似性)来仅 printf?

# =

% =

ld = 长整数

! = 不是吗?

\n = 换行

此外,我们的幻灯片上的指针似乎以两种不同的方式书写。

有:

 void* function_name(void* args)

还有:

 void* function_name(void *args)

星号位置的意义是什么?在这个例子中哪个看起来是正确的?

【问题讨论】:

  • 除了你列出的那个之外,它们只是字符。
  • @Dai:不是真的。 % 存在 (%ld)。
  • %ld 指的是tid 变量,#! 只是普通字符。
  • 空格被忽略 void* argsvoid *argsvoid * argsvoid*args 都是一样的意思。
  • 您的PrintHello 函数调用未定义的行为,因为您未能返回void *

标签: c++ c variables syntax


【解决方案1】:

当打印带有变量的东西时,您需要% 声明这是var 输入的位置。 # 只是一个普通字符。 ld 仅代表您输入的 var 类型。在这种情况下,long! 也没什么意思,它只是一个普通字符。此外,在打印var 时,唯一重要的(在这种情况下)是% 和在这种情况下为ld 的变量类型之间的东西。 \n 只是表示你之前所说的换行。

星号位置不会改变任何东西。两者都是正确的。星号的原因只是告诉你它是一个指针

【讨论】:

    【解决方案2】:

    阅读您的编译器文档以获取printf()。或在线文档,如this onethis one。文档将向您准确解释各种参数和占位符是什么。

    在您的示例中,#! 没有任何意义。它们在任何格式说明符之外,因此它们只是文字字符数据,就像您的大多数格式字符串内容一样。只有以% 开头的说明符才有特殊含义。

    % 字符是一个转义字符,它告诉printf() 处理以下ld 说明符。 printf() 会将%ld 替换为格式化字符串中tid 变量的值。

    【讨论】:

      【解决方案3】:

      也许您也有兴趣查看类似的 C++ 语句?

      另外,对于你们中的一些人,C++ 版本将解释 printf 格式信息的作用。


      • std::printf 默认将输出定向到标准输出。 C++ 使用 std::cout

      • '#' 和 '!'只是字符(两种形式)

      所以,在 C++ 中:

      std::cout << '#' << tid << "!\n";
      

      但是,我可能会使用:

      std::cout << '#' << tid << '!' << std::endl;
      

      注意事项:

      • 您是否注意到没有 %ld?编译器已经知道 tid 的类型(即 long int),因此您无需像使用 std::printf 那样再次向 std::cout 解释它。

      • 另外一个好处是,当有人将 tid 类型更改为 int32_t(或者可能是 int64_t 或 static_cast 为更小的值)时,cout 行不受影响。快速,对于“long long unsigned int”,%XXd 的 XX 是多少?不如我们再也不查了。


      星号位置的意义是什么?看起来是 在这个例子中正确吗?

      这两种形式都是“正确的”。我更喜欢'*'形式,可能是因为我的背景(很少有'c'曝光)。

      【讨论】:

        【解决方案4】:

        正如其他人已经说过的,格式字符串"Hello World! It's me, thread #%ld!\n" 中的%ld 定义了将放置long 类型的变量的位置。 #! 是普通字符,\n 代表换行(特殊字符反斜杠赋予后续字符特殊含义)。

        但是,当您分配 long tid =(long)threadidthreadid 的类型为 void*(即指向某些非特定类型的指针)时,您的代码中还有另一个问题。实际上,如果你知道threadid 将指向一个long,你应该写long tid = *((long*)threadid) 以便取消引用指针并将其解释为特定类型long;否则,您将分配指针值(即某个内存地址)。

        【讨论】:

          【解决方案5】:

          这不是 C 语言的特定关键字。 让我分解一下来解释一下。

          #%ld!\n
          

          等于

          #   : Hash character to show count/numbers 
          %ld : Specifier referencing a long integer that you want to show.
          !   : Simple exclamatory character.
          \n  : New line 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-27
            • 2018-05-10
            • 2011-12-15
            • 2021-07-31
            • 2020-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多