我有一个问题,编译器如何对以下代码进行操作:
#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++是的当前值c11。分别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值