C++三目运算符返回值类型问题

我想知道三目运算符的返回值类型是怎么规定的。
比如:
int main(){
int a = 8;
int b = 5;
(a > b ? a : b) = 1;
return 0;
}
可以编译通过(无论在Visual Studio还是GNU内核的Dev-Cpp),说明返回值有左值,类型相同的情况我已经知道了,不需要您赘述。
当冒号两边的类型可以互相转换的时候返回哪个的类型?返回值有没有左值?

三目运算符是这样的:A?B:C,若A表达式为真,则三目运算符结果为B表达式的结果, 若A为假,则为C的结果,8>5为真,则返回变量a
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-19
向高类型转换,就像+-*/一样....
例如
int a = 8;
long b = 5;
(a > b ? a : b) = 1;
等价于a = 1;
这个行为实际上是未定义的,因为c++标准里没有(哪怕是c++11)追问

有问题啊!如果两边都是自定义类型,或者有一个是自定义类型怎么办?

追答

编译失败

提示lvalue required as left operand of assignment

即非左值

VC++2012里也提示错误

刚才测试了一下,当类型不同时,gcc3.2可以通过编译,但其他版本无一通过....

我的意思是

int a = 8;

long b = 5;

(a > b ?  a : b) = 1;

仅仅在gcc3.2下编译通过...............

类型必须相同

追问

需要转换时没有左值我完全赞同。
我想对于自定义类型,什么叫“向高类型转换”?
class B;

class A{

public:
int x;
operator B();
};
class B{
public:
double x;
operator A(){A a; a.x=0; return a;}
};
A::operator B(){B b; b.x=0; return b;}
超字数,后面main,你应知我要写什么

追答

例如有继承关系,就向父类型转换,但是这得经过试验,测试中.

事实证明gcc3.2真是一个坑爹的编译器....该对的不对,该错的却对

gcc4.7编译通过,向继承关系的上层转换

(部分省略)

struct A
{
   int a;
   A(int _a)
   {
       a = _a;
   }
};
struct B : public A
{
   long b;
   B(int _a, long _b):A(_a)
   {
       b = _b;
   }
};
int main()
{
   A a(3);
   B b(4, 5);
   (a.a < b.b ? b : a) = A(8);
   return 0;
}

 其实我更倾向于在这个运算中没有转换,因为无论是父类型对象还是子类型的对象,都可以用B(XX, XX)来赋值....

 

没有继承关系的貌似不可以作为左值...

刚才才发现你有重载....不过加了重载也还是通不过编译,因为实际上仍然用了类型转换。只是从默认的变为自定义的而已...

本回答被提问者采纳
第2个回答  2013-07-19
标准规定如果冒号两边的类型可以【互相】转换,程序就是ill-formed

C++三目运算符返回值类型问题
三目运算符是这样的:A?B:C,若A表达式为真,则三目运算符结果为B表达式的结果, 若A为假,则为C的结果,8>5为真,则返回变量a

C++中a> b? a: b是什么意思?
在C++中,a > b ? a : b 是一个三目运算符(ternary operator),也被称为条件运算符(conditional operator)。这个运算符会首先比较 a 和 b 的值,然后根据比较结果来决定返回的值。具体的行为如下:如果 a > b 为真(即 a 大于 b),那么运算符将返回 a 的值。如果 a > b 为假(即...

三目运算符在C语音和C++语言中的区别
三目运算符的返回类型不同。C语言中,三目运算符返回的是变量值,不能作为左值使用。C++中,三目运算符直接返回变量本身,因此可以作为左值使用。例如:int a = 2;int b = 3;(a>b?a:b) = 9;这个例子可以在C++中使用,但是在C语言中,三目运算符返回的是整数常量,不能作为左值使用。注意:...

C++ 三目运算符问题
三目运算就是下面这算式了 a>="a"&&a<="z")?(a+32):a 它的意思是:a代表的字符在小写字母'a'和'z'之间吗?如果是,运算结果是a+32;如果不是,结果是a 这段程序应该是字母大小写转换,但有点问题。如果是想把小写转成大写,后面应该是(a-32);如果是想把大写转成小写,引号里应该是...

c++三目运算符很奇怪! unsigned int k=2; int l=-6; cout<<((l+k)>...
unsigned int k=2,是一个没有符号的整形数字,所以当它可i相加时,就成了X值,因为这个X是一个正数,所以=X X大于0 (l+k)>0?1:0,很明显,我们可以看出是输出1了 如果不明白给一个代码你 include <iostream.h> int main(){ unsigned int k=2;int l=-6;cout<<(k+l)<<endl;retu...

c++ 三目运算符 直接输出结果不正确
首先你要知道<<其实也是一个运算符,从你的例子可以看出它跟括号外的符号运算符同级(比如比较用的==,<=,>=,判断用的?等等,当然比+-*\/小,它会先算+-*\/),你不加括号,他就输出(a>=b)判断后的结果,也就是1;加了括号后它就能如你所愿的执行了 ...

C++里return x>y 是什么意思?
return是返回, x > y这里形成一个逻辑值, 所以返回就是bool类型

c++中的“( minute < 10 ? "0" : "" ) ”什么意思?还有“( hour <...
?:是三目操作符 比如 int c=a<b?a:b;意思为当a<b时c就取a的值,否则就取b的值 同理 minute < 10 ? "0" : ""如果 minute<10成立,那么表达式的返回值就是“0”字符串(不是字符)如果不成立,返回值就是 “ ”字符串

c++中的三目运算符执行的结果是?
执行的结果:首先比较a和b的大小,当ab为1的时候那么会执行表达式c<d?c:d,然后比较c和d的大小,如果c小于d那么表达式的结果就为c,如果c大于d,那么表达式的结果为d。因为a=1,b=2,所以a

return A > B ? A > C ? A : C : B > C ? B : C;什么意思
C++中“?:”是一个三目运算符,用法为p?a:b,其中p为返回值为布尔型的表达式,若p为真,则表达式返回a,否则返回b.问题中的语句可以打上括号而不改变其意义:return ( A > B ? (A > C ? A : C ) : (B > C ? B : C) );,意思是若A>B,则返回(A > C ? A : C ),...

相似回答