C中的条件运算符一元

时间:2014-09-01 04:35:09

标签: 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 %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);

}

4 个答案:

答案 0 :(得分:5)

三元运算符的语法是: 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]);

答案 1 :(得分:1)

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]);
}

答案 2 :(得分:1)

表达式

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]);
}

答案 3 :(得分:0)

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

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进行类似的解析,你会得到相同的结果。