【问题标题】:called object is not a function or function pointer in use of ternary被调用的对象不是使用三进制的函数或函数指针
【发布时间】:2015-05-21 06:02:43
【问题描述】:

我不断收到:

error: called object is not a function or function pointer

当使用这样的三元运算符时:

puts("\nx: " (0 == 1) ? "y1\n" : "y2\n");


我做错了什么?

【问题讨论】:

  • 请不要关注该行的内容。我只是举例说明。重点在于语法,与原点保持一致。

标签: c io ternary-operator puts


【解决方案1】:

你试图调用一个既不是函数也不是函数指针的对象!特别是,编译器看到字符串后面的左括号并认为(就像编译器可以说“认为”一样)您正在尝试调用函数调用。您不能像尝试那样将字符串与三元运算符连接起来。试试:

printf("\nx: %s", (0 == 1) ? "y1\n" : "y2\n");

【讨论】:

  • 谢谢。好吧,我想我可以,因为我可以printf("sample"" continues"); 现在三元对我来说更没用了。
  • 两个文字字符串确实可以这样连接。该规则不会扩展到其他令牌。
  • @Malina 不是,你的代码和这个解决方案没有太大区别。
  • @iharob 技术上是的。但是亲三元还是有区别的。
【解决方案2】:
puts("\nx: " (0 == 1) ? "y1\n" : "y2\n");

这不是做你想做的事情的正确方法,因为你不能像这样连接 C 字符串。

您可以使用puts()

puts("\nx: ");
puts((0==1) ? "y1\n" : "y2\n");

编辑:(@WilliamPursell 建议

为避免附加不需要的换行符,请使用fputs() 而不是puts()

fputs("\nx: ");
fputs((0==1) ? "y1\n" : "y2\n");

【讨论】:

  • 这将在: y 之间插入一个额外的换行符。
  • 是的,你是对的。它会。你的printf() 方法更好。
【解决方案3】:

你不能按照你的方式连接字符串。

简单的解决方案是使用 printf

printf("\nx: %s", (0 == 1) ? "y1\n" : "y2\n");

或者如果你坚持使用 puts 你需要来自 string.h 的 strcat 函数

char s[256] = "\nx: ";
puts(strcat(s, (0 == 1) ? "y1\n" : "y2\n"));

【讨论】:

    【解决方案4】:

    这是你的代码

    "\nx: " (0 == 1) ? "y1\n" : "y2\n"
    /*     ^ this is ignored        */
    

    所以看起来好像字符串文字被作为函数调用 -> "\nx: "(0 == 1),看起来不是这样吗?

    你可以用这样的printf()函数实现你想要的

    printf("\nx: %s\n", (0 == 1) ? "y1" : "y2");
    

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2022-10-19
      • 2012-06-22
      相关资源
      最近更新 更多