注册 登录
编程论坛 C++教室

两个语句 不明白 return c1!=c2?c1<c2:c1<c2; cin.clear();

woshiyexinji 发布于 2012-03-17 13:21, 350 次点击
  return c1!=c2?c1<c2:c1<c2;
  cin.clear();
//这两个什么意思

#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

bool comp(const string &s1,const string &s2)
{
    int i,j,k,m,n;
    int c1=0,c2=0;
    for(i=0;i<s1.size();i++)
    {
        for(j=i+1;j<s1.size();j++)
        {
            if(s1[i]>s1[j])
            c1++;
        }
    }
    for(i=0;i<s2.size();i++)
    {
        for(j=i+1;j<s2.size();j++)
        {
            if(s2[i]>s2[j])
              c2++;
        }
    }
    return c1!=c2?c1<c2:c1<c2;
}
int main()
{
    string s;
    vector<string> v;
    int n,a,b;
    cin>>n;
    int i,j,k;
    int p=0;
    for(i=0;i<n;i++)
    {
        cin.clear();
        cin>>a>>b;
        v.clear();
        p++;
        for(j=0;j<b;j++)
        {
            cin>>s;
            v.push_back(s);
        }
        sort(v.begin(),v.end(),comp);
        if(p!=1)  cout<<endl;
        for(k=0;k<v.size();k++)
        {
            cout<<v[k]<<endl;
        }
    }
    return 0;
}
2 回复
#2
CooperOne2012-03-17 15:50
return c1!=c2?c1<c2:c1<c2;
这是三目运算符...
就是:
return (c1!=c2)?(c1<c2):(c1<c2);
先判断第一个括号里面是否为真,真的话返回第二个括号,假返回第一个括号

具体流程是这样的
先判断c1和c2是否相等
假如不相等的话
   再判断c1是否小于c2,是的话返回true,c1大于c2返回false
假如相等的话
   判断c1<c2是否成立(废话肯定不成立了),如果不成立返回false

综上所述
假如这个函数返回true的话,说明c1<c2;返回false的话说明c1>=c2;

(其实第二个括号里面直接写0不就行了么...)
#3
lz10919149992012-03-17 15:52
return c1!=c2?c1<c2:c1<c2;
如果c1的值不等于c2,则返回c1小于c2的比较结果,否则返回c1小于c2的比较结果。这里只要c1不等于c2都会返回c1小于c2的比较结果,这样写有什么意思呢?
cin.clear();
清除标准输入流中的错误。
1