繁体   English   中英

两种语法有什么区别?

[英]What is the difference between the two syntax?

为什么

(a?b:c)=5;

在“ C”中显示所需的左值,而

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

很好吗? 两者有什么区别?

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

我不明白的是:如果我们写b=5*(&b)=5会产生什么区别?

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

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

但是,您的问题似乎忽略了真正的问题:为什么它在第二种情况下有效,但在第一种情况下不起作用。 这与C语言中的表达式及其处理方式有关。

?:运算符的结果是一个值; 具体来说,它是一个右值 宽松定义的值是不能在赋值左侧出现的值。 之所以命名它们,是因为它们是赋值在赋值右侧的值。 例如,表达式“ 5”是右值表达式。 你不能做5 = 40; 废话

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

但是,表达式(a + b)是一个右值表达式 ,而不是左值。 并且有充分的理由; 你不能再做(a + b) = 30; 比你可能的(5 + 10) = 30;

和上面的+运算符一样, ?:运算符的结果是一个右值表达式。 这解释了为什么(a?b:c) = 5; 不起作用; 您正在尝试为右值表达式分配值。 那是非法的。

现在,让我们看第二种情况。 我们知道?:导致一个右值表达式。 现在,这说明了表达式的分类是什么,但是表达式结果的类型又如何呢? 那么,假设bc均为int S, 类型 (a?b:c)也被int

但是,当您执行(a?&b:&c) ,此表达式的类型为int* ,而不是int 它是指向整数的指针 这是类型为“指向int指针”的右值表达式。 它将返回b的地址或c的地址。

当您拥有一个int* ,并且使用*运算符对其进行取消引用时,您会得到什么? 您将得到一个类型为int左值表达式 由于(a?&b:&c)int*类型的右值表达式,因此,如果取消引用它,将得到int类型的左值表达式。 此左值将是指任一bc ,取决于内容a

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

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

*ptr = 5;

您将获得一个指针,该指针可以指向任何特定的内存位置,然后在指向的位置中存储一些内容。 就这么简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM