我有一个问题,编译器如何对以下代码进行操作:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
我不知道为什么结果d = 11
。
我有一个问题,编译器如何对以下代码进行操作:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
我不知道为什么结果d = 11
。
Answers:
在int d = (b == c++) ? (c+1) : (c-1);
:
c++
是的当前值c
11。分别c
增加到12。b == 11
是假的,因为b
是12。(b == c++)
为false,因此(c-1)
被使用。同样,c
到这一点,必须完成到12 的增量。c
是12,所以c-1
是11。d
初始化为该值11。根据C标准(6.5.15条件运算符)
4对第一个操作数求值;在它的评估与第二个或第三个操作数的评估(无论哪个被评估)之间都有一个序列点。仅当第一个操作数不等于0时,才对第二个操作数求值;仅当第一个操作数等于0时,才计算第三个操作数;结果是第二个或第三个操作数的值(以所评估的为准),转换为下面描述的类型。110)
因此,在此声明的初始化表达式中
int d = (b == c++) ? (c+1) : (c-1);
将变量b
与变量的值进行比较,c
因为后递增运算符在递增操作数之前会返回其操作数的值。
由于值彼此不相等(b
设置为12,而c
设置为11),因此将(c-1)
评估子表达式。
根据报价,在评估操作员的状况之后会有一个顺序点。这意味着在对条件c
求值12
后,将后递增运算符应用于变量之后,该值便具有值c
。结果,变量d由值1
(12 - 1
)初始化。
?:
。因为通常在C语言中,++
与同一操作数上的其他操作合并是未定义的行为。此代码仅可预测地起作用,因为它们?:
具有各种特殊的雪花规则。
由于条件为假,因此false
将发生这种情况:c-1
,但是由于您c
在条件中增加c++
,因此c
现在为12
。因此,结果12-1为11。
编辑:OP误解了职位增量。
因此,实际发生的情况是这样的:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
条件,OP指的是操作顺序。条件为假,但随后使用的原始值c
来计算c - 1
,而不是增量版本。
c++
和之间可能会有误解++c
c++
是后递增运算符。的值为c++
11,具有make的副作用c == 12
。++c
将有12值