【问题标题】:Basic Conditional Operator基本条件运算符
【发布时间】:2021-09-18 13:32:17
【问题描述】:

我尝试使用条件运算符来减少以下 C 程序中的代码行数,但是,我没有得到想要的结果。

目标 - 将 x 的值设置为 50 if y > 7 else 设置为 25

#include <stdio.h> // Conditional Operator

int main()
{
    int x, y;

    printf("Enter x: ", x);

    scanf("%d", &x);

    printf("Enter y: ", y);

    scanf("%d", &y);

    if (x = y > 7 ? 25 : 50)
    { 
        printf("Value of x: %d", x);
    }  
    else
    {
        printf("Failed\n");
    }
}

【问题讨论】:

  • 应该是x = (y &gt; 7 ? 50 : 25)。也就是说,需要括号并且需要反转三元值。另外,scanf("%d",&amp;x); 的意义何在,如果您在再次使用之前将其设置为其他内容?
  • 另外,你为什么认为你可能会打印“失败”?并且您应该在打印x 的代码中包含一个换行符,并且您应该无条件地打印x。而且,作为一般规则,使用条件运算符来尝试减少行数并不是一个特别好的主意——你的目标应该是代码的清晰性,这样你和编译器就不会相互误解。
  • 请注意,printf("Enter y: ", y);printf() 的参数过多。对于另一个提示也是如此,尽管提示 x 没有什么意义,因为您分配给它而不是使用输入的值。严格来说,您应该检查对scanf() 的调用是否成功(返回1),以便您知道用户输入了一个整数值,而不是一个单词或其他一些非数字数据。
  • 如果您稍后设置,为什么要输入x。另外,为什么if 声明?它应该只是x=(y &gt; 7 ? 25 : 50)。另外,你真的需要打印else 部分吗?
  • @kaylum > 的优先级高于 ?: 的优先级高于 =。所以不需要括号(但无论如何都是好的做法)。

标签: c conditional-statements operators


【解决方案1】:

目标 - 如果 y > 7 则将 x 的值设置为 50,否则将其设置为 25

那么你在这里交换了值:

y > 7 ? 25 : 50
        ^^   ^^
         wrong

必须是:

y > 7 ? 50 : 25

原因是:

y > 7 ? 50 : 25
\---/    |    |
  |      |    -----> Result if condition is FALSE
  |      |
  |      ---> Result if condition TRUE
  |
condition

其他说明

  1. 为什么总是用 50 或 25 覆盖 x 作为输入?

  2. 始终检查来自scanf的返回值

  3. 无法访问您的if 语句的else 部分。所以可以删除。

  4. printf("Enter y: ",y); 是错误的。你不打印y。所以删除,y

所以简单地做:

#include <stdio.h>

int main(void)
{
    int x,y;

    printf("Enter y: ");

    if (scanf("%d",&y) != 1)
    {
        puts("wrong input");
        return 0;
    }

    x = y > 7 ? 50 : 25;
    printf("Value of x: %d", x);

    return 0;
}

最后说明

你的代码有这一行:

if (x = y > 7 ? 25 : 50)

在这里,您在if 条件内对x 进行赋值,然后将分配的值用作if 的条件。

虽然它是完全合法的 C 代码,但大多数程序员认为它不好。原因是容易混淆

if (x == y > 7 ? 25 : 50)
      ^^
    Did you really want a compare!?

一般来说,最好避免在if 条件下赋值,即你可以这样做:

x = y > 7 ? 25 : 50;
if (x)

相反。这样做的另一个好处是,无法访问else 部分也更加清楚。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2017-12-03
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多