【问题标题】:How can I use the conditional operator to print an integer or a string value如何使用条件运算符打印整数或字符串值
【发布时间】:2017-07-22 23:06:54
【问题描述】:

在 C 语言中,如何在使用两种不同数据类型的 printf 语句中使用条件运算符?我想让下面的代码在每次遇到偶数时不打印任何内容而不是零。我还希望能够在遇到某些数字时打印一个字符串。

我尝试了类型转换 (char)list[i] 但这会导致类型转换不兼容,因为 printf 语句需要一个整数。

只打印奇数

int fail = 0;

    int list[] = {1, 2, 3, -1, 4};
    int size = sizeof(list) / sizeof(list[0]);

    for(int i = 0; i < size; i++) {
        if(list[i] == -1) {
            break;
        }
        printf("%d\n", (list[i] % 2 == 0) ? (i) : (fail));
    }

【问题讨论】:

  • 为什么不使用if 语句在适当的printf 语句之间进行选择?
  • 您可以使用相同的? 运算符在“%s”和“%d”之间进行选择作为格式说明符字符串...
  • 会怎么样?运算符在格式说明符内工作?
  • 类似printf((list[i] % 2 == 0) ? "%s\n" : "%d\n", ...
  • @bruceg:最终会评估条件两次,不是吗?这只是(list[i]%2?printf("%d\n", i);printf("%s\n", "odd"); 的一小步:)

标签: c printf conditional-operator


【解决方案1】:

正确且易读的方法是多次调用printf,每个调用都有自己的格式和参数:

if (list[i] % 2 == 0) {
  printf("%d\n", i);
}
else if (i == 42) {
  puts("The answer");
}
/* Otherwise, print nothing */

您也可以使用 ?: 运算符来做到这一点:

(list[i] % 2 == 0) ? printf("%d\n", i) :
(i = 42)           ? printf("%s\n", "The answer") :
                     0;

(这是可行的,因为所有三个可能的返回值都是打印的字符数。)

如果您只想打印 0 而不是 0,请使用 0 作为格式说明符的精度(不是宽度):

printf("%.0d\n", i);

(在混淆代码中,您可以使用三元运算符将要隐藏的值强制为 0。甚至可以使用乘法。)

C 是一种强类型语言,这意味着编译器需要能够推断出任何表达式的类型。这包括?: 表达式,因此该运算符的第二个和第三个参数不可能具有不兼容的类型。

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2020-10-06
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多