Vip*_*ash 11 c pointers operator-precedence post-increment
表达式1:*p++;
where p
是指向整数的指针.
p
将首先递增,然后由于关联性(从右到左)获取它指向的值.这样对吗?
表达式2:a=*p++;
where p
是指向整数的指针.
首先取值,p
然后分配给a
第一个然后p
由于后增量而增加.这样对吗?
Sou*_*osh 18
首先,让我告诉你,在这里,关联性和评估顺序实际上都不相关.这完全取决于运营商的优先级.我们先看看定义.(强调我的)
优先级:在数学和计算机编程中,操作的顺序(或操作符优先级)是一组规则,它们反映了为了评估给定的数学表达式而首先执行哪些过程的约定.
关联性:在编程语言中,运算符的关联性(或固定性)是一种属性,用于确定在没有括号的情况下如何对相同优先级的运算符进行分组.
评估顺序:除少数情况外,未指定任何C运算符的操作数的评估顺序,包括函数调用表达式中函数参数的评估顺序,以及任何表达式中子表达式的评估顺序.主要有两种类型的评估:a)价值计算b)副作用.
后增量具有更高的优先级,因此将首先进行评估.
现在,恰好值增量是在"值计算"之后排序的操作的副作用.因此,值计算结果将是操作数的未改变的值p
(这里,再次,由于使用*
运算符而被取消引用),然后,增量发生.
引用C11
,第5.6.2.4章,
后缀
++
运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).有关约束,类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.在更新操作数的存储值的副作用之前,对结果的值计算进行排序.[......]
两种情况下的评估顺序是相同的,唯一的区别是,在第一种情况下,最终值被丢弃.
如果使用第一个表达式"as-is",则编译器应生成有关未使用值的警告.
后缀运算符的优先级高于一元运算符.
这样表达
*p++
Run Code Online (Sandbox Code Playgroud)
相当于表达式
*( p++ )
Run Code Online (Sandbox Code Playgroud)
根据C标准(6.5.2.4后缀增量和减量运算符)
2 postfix ++运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).有关约束,类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.在更新操作数的存储值的副作用之前,对结果的值计算进行排序.
因此p++
,p
作为操作的结果产生指针的原始值,并且还具有递增操作数本身的副作用.
至于一元运算符那么(6.5.3.2地址和间接运算符)
4一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义
所以表达式的最终结果
*( p++ )
Run Code Online (Sandbox Code Playgroud)
是指针指向的对象的值,p
由于副作用也会递增.此值将分配给a
语句中的变量
a=*p++;
Run Code Online (Sandbox Code Playgroud)
例如,如果有以下声明
char s[] = "Hello";
char *p = s;
char a;
Run Code Online (Sandbox Code Playgroud)
然后在这个声明之后
a = *p++;
Run Code Online (Sandbox Code Playgroud)
对象a
将具有该字符'H'
,指针p
将指向该字符的数组的第二个字符'e'
.
结合性在这里不相关。关联性仅在具有相同优先级的相邻运算符时才重要。但在这种情况下,++
具有比 更高的优先级*
,所以只有优先级很重要。由于优先级,该表达式等效于:
*(p++)
Run Code Online (Sandbox Code Playgroud)
由于它使用后增量,因此p++
增加了指针,但表达式返回指针在增加之前的值。然后间接使用该原始指针来获取值。它实际上等效于:
int *temp = p;
p = p + 1;
*temp;
Run Code Online (Sandbox Code Playgroud)
第二个表达式是相同的,除了它将值分配给另一个变量,因此最后一个语句变为:
a = *temp;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1297 次 |
最近记录: |