求助三目运算符

P5719 【深基4.例3】分类平均

R浩轩泽Anmicius @ 2021-04-22 17:29:31

原来的代码:

#pragma GCC opitimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
double a,b,num_a,num_b;
inline void read(int &x){
    x=0;int f=1;char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        x=x*10+(ch^48);
        ch=getchar();
    }
    x*=f;
}
int main(){
    read(n);read(k);
    for(int i=1;i<=n;++i)
    (!(i%k))?++num_a,a+=i:++num_b,b+=i;
    printf("%.1lf %.1lf",a/num_a,b/num_b);
    return 0;
}

这样样例都过不了,果断放弃三目:

#pragma GCC opitimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
double a,b,num_a,num_b;
inline void read(int &x){
    x=0;int f=1;char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        x=x*10+(ch^48);
        ch=getchar();
    }
    x*=f;
}
int main(){
    read(n);read(k);
    for(int i=1;i<=n;++i)
    if(!(i%k))++num_a,a+=i;
    else ++num_b,b+=i;
    printf("%.1lf %.1lf",a/num_a,b/num_b);
    return 0;
}

这样就A掉了

这三目和if有什么区别吗)


by _caiji_ @ 2021-04-22 17:32:54

?: 的优先级比 , 低,所以

(!(i%k))?++num_a,a+=i:++num_b,b+=i;

实际上相当于

((!(i%k))?++num_a),(a+=i:++num_b),(b+=i);

至于怎么过的编译我不清楚


by _caiji_ @ 2021-04-22 17:39:58

具体什么运算顺序可以看这张表


by ud2_ @ 2021-04-22 17:58:54

@R浩轩泽Anmicius 运算符优先级的问题当然要画表达式树了。

你以为这个表达式会被解析成

?:
  !(i % k)
  ,
    ++num_a
    a += i
  ,
    ++num_b
    b += i

实际上它是

,
  ?:
    !(i % k)
    ,
      ++num_a
      a += i
    ++num_b
  b += i

by R浩轩泽Anmicius @ 2021-04-22 23:02:15

@caijianhong 谢谢您!!!


by R浩轩泽Anmicius @ 2021-04-22 23:02:38

@sjx233_ 谢谢谢谢


|