若有定义:int aa[8];,则以下表达式中不能代表数组元素aa[1]的地址的是


A. &aa[0]+1
B. &aa[1]
C. &aa[0]++
D. aa+1
需要详细解答,谢谢~

选C。

aa是数组名的同时也是这个数组首元素的首地址,也就是aa=&aa[0]。找橡游盯aa[1]的地址就是首地址偏移一个整形位,所以A,D对。

B就是对元素aa[1]取地址,所以ABD对。C中&梁和小于后置++的优先级所以&aa[0]++等价于&(aa[0]++)所以先对aa[0]中的元素值加1后,在对aa[0]取址,结果还是aa[0]的地址,故C错。

扩展资料

C语言的运算符主要用于构成表达式,同一个符号在不同的表达式中,其作用并不一致。下面按计算的优先顺序,分别说明不同作用的表达式。需要特别指出,在C语言标准中磨胡,并没有结合性的说法。

相同优先级运算符,从左至右依次运算。注意后缀运算优先级高于前缀。因此++i++应解释为++(i++)。

而与或非的运算优先级都不一样,因此a && b || b && c解释为(a && b) || (b && c)

合理使用优先级可以极大简化表达式。


C是对的取地址&与自增++是同一优先级且都是自右至左结合的,所以aa[0]加一后在对数值取地址,没有意义。

c(a++为后置运算:C语言先引用变量的数值作为整个自违章罚款表达式的值,然后执行对该变量的加1运算)

D(p最终的值为&b,所以*pp最终的值也为&b,输出语言中。*p即为取&b地址中的数值,即b的值20,**pp同理)

扩展资料:

一个表达式的赋值和算符的定义以及数值的裂慧定义域是有关联的。

两个表达式若被说是等值的,表示对于自由变量任意的定值,两个表达式都会有相同的输出,即它们代表同一个函数。

一个表达式必须是合式的。亦即,其每个算符都必须有正确的输入数量,在正确的地方。如表达式2+3便是合式的;而表销源丛达式*2+则不是合式的,至少不是算术的一般标记方式。

参考资料来源:百度亏樱百科-表达式


选C
aa是数组名的同时也是这个数组旅凯首元素的首地址,也就是aa=&aa[0]
找aa[1]的地址就是首地址偏移一个整形位,所以A D 对
B就是对元素aa[1]取地址
所以ABD对
C中&小于后置++的优先级所以&aa[0]++等价于
&(aa[0]++)所以先对aa[0]中的元素值加拆数唤1后,在对aa[0]取址,结果还是毕竖aa[0]的地址
故C错
选c,以下是一个验证程序:

#include<iostream>
using namespace std;

int main(){
int aa[8];
cout << &aa[0]+1 <<" "
<< &aa[1] <<" "
<<aa+1 <<" ";
return 0;
}
############
D:\c练习>a
0x28ff04 0x28ff04 0x28ff04

------------------------------------
如闭凯果加入c选项则编译不通过返脊:
D:\c练习>g++ dz.cc
dz.cc: In function 'int main()':
dz.cc:6:37: error: lvalue required as unary '轿世唤&' operand
C是对的取扒胡地址&与自增++是同一优先级且都是自右至左结合的,所以aa[0]加一后在对数值取地址,李此激没哪袜有意义。