这两种语法有什么区别?

Ash*_*wyn 1 c

为什么

(a?b:c)=5;

在'C'中显示所需的左值

*(a?&b:&c)=5;

完全没问题?两者有什么区别?

假设a = 1,对于第一种情况,它给出b = 5,第二种情况给出,*(&b)=5.`

我无法理解的是:如果我们写b=5或者它有什么不同*(&b)=5

Nic*_*las 6

如果我们写b = 5或*(&b)= 5,会有什么不同?

第二个获取指针b,然后取消引用该指针,将5存储到获得的指针中.

但是,你的问题似乎忽略了一个真正的问题:为什么它适用于第二种情况,而不是第一种情况.这与C中的表达式以及如何处理它们有关.

?:运算符的结果是一个值; 具体来说,它是一个右值.松散定义,rvalue是一个不能在赋值的左侧进行的值.它们之所以如此命名,是因为它们的价值落在作业的右侧.例如,表达式"5"是右值表达式.你不能这样做5 = 40;是胡说八道.

命名变量是左值.您可以在等式的左侧放置左值.表达式a是一个左值表达式(假设它a是一个在范围内的变量名).

但是,表达式(a + b)rvalue表达式,而不是左值.有充分的理由; 你不能(a + b) = 30;比你做的更多(5 + 10) = 30;.

?:运算符的结果是rvalue表达式,就像+上面的运算符一样.这解释了为什么(a?b:c) = 5;不起作用; 您正在尝试为rvalue表达式赋值.那是违法的.

现在,让我们看看第二种情况.我们知道这会?:导致rvalue表达式.现在,这解释了表达式的分类是什么,但表达式的结果类型如何呢?那么,假设bc均为intS,该类型(a?b:c)也是int.

但是,当你这样做时(a?&b:&c),这个表达式的类型int*不是int.它是一个指向整数的指针.它是"指向int" 的类型的右值表达式.它将返回地址b或地址c.

如果你有一个int*,并且你用*操作员取消引用它,你会得到什么?你得到一个类型的左值表达式int.由于(a?&b:&c)是类型的右值表达式int*,如果取消引用它,您将得到一个类型的左值表达式int.这个左值将参考b或者c,取决于的内容a.

简单来说,它的工作原理如下:

int *ptr = NULL;
if(a)
  ptr = &b;
else
  ptr = &c;

*ptr = 5;
Run Code Online (Sandbox Code Playgroud)

你得到一个指针,它可以指向任何特定的内存位置,然后你在指向的位置存储一些东西.就这么简单.