【问题标题】:Conditional operator unary in CC中的条件运算符一元
【发布时间】:2014-10-25 06:31:56
【问题描述】:

谁能向我解释或告诉我如何解决我使用条件运算符遇到的这个编码问题

它似乎总是跳过条件运算符,即使我将服务器更改为 0 或 1,也只打印第二个选项

它总是打印出第二个选项 SetB 然后是 SetA

为什么这不起作用?这是某种语义错误吗?还是逻辑错误?

#include <stdio.h>
#include <limits.h>

int main(int argc, char *argv[]){

   int ch = -191;
   int x = UINT_MAX;
   int setA[5]={-1,-1,-1,-1,-1};
   int setB[5]={-2,-2,-2,-2,-2};
   int server = 1;
   int i=2;

   printf("%d %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]);
   printf("%d %d\n",server==0?setA[i],setB[i]:setB[i],setA[i]);


  // printf("%u\n%u\n",ch,x);

}

【问题讨论】:

  • int x = UINT_MAX 是一个错误。 int 最多只能保存 INT_MAX 的值。
  • server==n?setA[i],setB[i]:setB[i] 表示server==n?setB[i]:setB[i]
  • 你可以简单地使用正确的语法来做你想做的事。 IE。而不是: printf("%d %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]);你可以这样做: printf("%d %d\n",(server==1)?(setA[i],setB[i]):(setB[i],setA[i]));

标签: c


【解决方案1】:

三元运算符的语法是:condition ? 表达式 : 表达式

在您的代码中,第一个表达式是setA[i], setB[i],第二个表达式是setB[i]。由于语言语法的工作方式,最后的逗号是参数分隔符(不是第二个表达式的一部分),因此您的代码相当于:

int a = (server == 1) ? setB[i] : setB[i];
printf("%d %d\n", a, setA[i]);

当然是一样的:

printf("%d %d\n", setB[i], setA[i]);

所以无论条件如何,您总是得到相同的结果。


如果您要在一个代码块中有许多类似的行,一个可能的解决方案是根据当前服务器设置一些集合别名:

// do this once:
int *set0, *set1;
if ( server == 1 )
    set0 = setA, set1 = setB;
else
    set0 = setB, set1 = setA;

// then use it like this    
printf("%d %d\n", set0[i], set1[i]);

【讨论】:

  • 我想不出一种优雅的方式来做你想做的事;预处理器宏的问题是它会对其参数进行两次评估;并且内联函数会很麻烦,因为您必须将数组以及条件结果传递给它
  • if ( server == 1 ) printf("%d %d", setA[i], setB[i]); else printf("%d %d", setB[i], setA[i]); 虽然这不能很好地扩展
【解决方案2】:
server==1?setA[i],setB[i]:setB[i],setA[i]

注意条件运算符之间的逗号运算符,此表达式的结果与您预期的不同。

相反,我建议使用if 语句。它更清晰,更不容易出错。

if (server == 1)
{
    printf("%d %d\n", setA[i], setB[i]);
}
else
{
    printf("%d %d\n", setB[i], setA[i]);
}

【讨论】:

  • 虽然打印的是第二个选项 setB[i],setA[i]
【解决方案3】:

表达式

server==1?setA[i],setB[i]:setB[i],setA[i]

相当于:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i])

相当于

(server==1? setB[i] : setB[i]), setA[i]

相当于

setB[i], setA[i]

但是,这不是你想要的。你想要的是:

if ( server == 1 )
{
  printf("%d %d\n", setA[i], setB[i]);
}
else if ( server == 0 )
{
  printf("%d %d\n", setB[i], setA[i]);
}

【讨论】:

    【解决方案4】:

    你应该像这样使用三元运算符:

    server == 1 ? printf("%d %d", setA[i], setB[i]):printf("%d %d", setB[i], setA[i]);

    第二个语句也是如此。

    你使用它的方式:

    如果server == 1
    然后setA[i], setB[i] 计算为setB[i],因为这是C 中逗号, 运算符的属性,并且只执行最后一条语句。

    如果server == 1
    那么

    printf("%d %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]);

    将被评估为(由于?: 运算符的优先级高于, 运算符)

    printf("%d %d\n",(server==1?(setA[i],setB[i]):setB[i]),setA[i]);

    这是

    printf("%d %d\n",setB[i], setA[i]);

    类似

    printf("%d %d\n",server==0?setA[i],setB[i]:setB[i],setA[i]);

    将被简单地评估为

    printf("%d %d\n",(server==0?(setA[i],setB[i]):setB[i]),setA[i])

    又是这样

    printf("%d %d\n",setB[i],setA[i]);

    你可以对server == 0进行类似的解析,你会得到相同的结果。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2013-07-13
      • 2015-02-15
      • 2022-12-06
      • 2015-07-12
      • 2023-04-03
      相关资源
      最近更新 更多