相关疑难解决方法(0)

三元条件和赋值运算符优先级

我对直接赋值和三元条件运算符优先级感到困惑:

#include<stdio.h>
int main(void)
{
    int j, k;

    j = k = 0;
    (1 ? j : k) = 1; // first
    printf("%d %d\n", j, k);

    j = k = 0;
    1 ? j : k = 1; // second
    printf("%d %d\n", j, k);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

1 0
1 0
Run Code Online (Sandbox Code Playgroud)

但它碰巧是:

1 0
0 0
Run Code Online (Sandbox Code Playgroud)

另外我得到这个警告:

main.cpp:20:warning:语句无效

这是我评论的第二行.

由于直接赋值运算符的优先级低于三元条件运算符,因此我期望将第一行和第二行注释为等效的行.但实际情况并非如此.

我用g ++ --version(Ubuntu 4.4.3-4ubuntu5)4.4.3尝试了这个

c++ conditional-operator operator-precedence

32
推荐指数
3
解决办法
6885
查看次数

三元运营商评估订单

class Foo {
  public:
  explicit Foo(double item) : x(item) {}

  operator double() {return x*2.0;}

  private:
  double x;
}

double TernaryTest(Foo& item) {
  return some_condition ? item : 0;
}

Foo abc(3.05);
double test = TernaryTest(abc);
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果some_condition为真,为什么test等于6(而不是6.1)?

如下更改代码会返回6.1的值

double TernaryTest(Foo& item) {
  return some_condition ? item : 0.0; // note the change from 0 to 0.0
}
Run Code Online (Sandbox Code Playgroud)

似乎(在原始示例中)来自Foo :: operator double的返回值被强制转换为int,然后返回到double.为什么?

c++ ternary-operator ternary

2
推荐指数
2
解决办法
3227
查看次数