C中的条件运算符一元

  • 本文关键字:一元 条件运算符 c
  • 更新时间 :
  • 英文 :


有人能向我解释或告诉我如何解决条件运算符的编码问题吗

它似乎总是跳过条件运算符,只打印出第二个选项,即使我将服务器更改为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 %dn",server==1?setA[i],setB[i]:setB[i],setA[i]);
   printf("%d %dn",server==0?setA[i],setB[i]:setB[i],setA[i]);

  // printf("%un%un",ch,x);
}

三元运算符的语法是:条件表达式表达式

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

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

这当然与相同

printf("%d %dn", 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 %dn", set0[i], set1[i]);
server==1?setA[i],setB[i]:setB[i],setA[i]

请注意条件运算符之间的逗号运算符,此表达式的结果不会如您所期望的那样。

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

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

表达式

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 %dn", setA[i], setB[i]);
}
else if ( server == 0 )
{
  printf("%d %dn", setB[i], setA[i]);
}

您应该使用这样的三元运算符:

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 %dn",server==1?setA[i],setB[i]:setB[i],setA[i]);

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

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

哪个是

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

以及类似的

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

将被简单地评估为

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

又是

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

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

最新更新