Bir soru var, derleyici aşağıdaki kod üzerinde nasıl çalışır:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Sonucun neden emin değilim d = 11
.
Bir soru var, derleyici aşağıdaki kod üzerinde nasıl çalışır:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Sonucun neden emin değilim d = 11
.
Yanıtlar:
İçinde int d = (b == c++) ? (c+1) : (c-1);
:
c++
geçerli değeridir. c
Ayrı olarak, c
12'ye çıkarılır.b == 11
yanlış, çünkü b
12.(b == c++)
yanlıştır, (c-1)
kullanılır. Ayrıca, c
12'ye kadar olan artış bu noktaya kadar tamamlanmalıdır.c
12'dir c-1
11'dir.d
bu değere sıfırlanır, 11.C Standardına göre (6.5.15 Koşullu operatör)
4 İlk işlenen değerlendirilir; değerlendirmesi ile ikinci veya üçüncü işlenenin değerlendirilmesi arasında (hangisi değerlendirilirse) bir sıralama noktası vardır. İkinci işlenen, yalnızca ilki 0 ile eşit değilse karşılaştırılır; üçüncü işlenen, yalnızca birinci işlenen 0'a eşitse değerlendirilir; sonuç, aşağıda açıklanan türe dönüştürülen ikinci veya üçüncü işlenenin (hangisi değerlendirilirse) değeridir.
Yani bu bildirimin ilk ifadesinde
int d = (b == c++) ? (c+1) : (c-1);
değişken b
, değişkenin değeri ile karşılaştırılır, c
çünkü artım sonrası operatör, onu arttırmadan önce işleneninin değerini döndürür.
Değerler birbirine eşit olmadığından ( 11'e ayarlanırken b
12'ye c
ayarlanır), sonra alt ifade (c-1)
değerlendirilir.
Alıntıya göre, operatörün durumunun değerlendirilmesinden sonra bir sıralama noktası vardır. Bu, durumun değerlendirilmesinden sonra, artış sonrası operatörünü değişkene uyguladıktan sonra c
değere sahip olduğu anlamına gelir . Sonuç olarak, d değişkeni değer ( ) tarafından başlatılır .12
c
1
12 - 1
?:
. Çünkü normalde C'de, ++
aynı işlenen üzerindeki diğer işlemlerle birleştirmek tanımsız bir davranıştır. Ve bu kod sadece tahmin edilebilir şekilde çalışır çünkü ?:
çeşitli özel kar tanesi kuralları vardır.
Koşul yanlışsa BEACUSE nedenle false
dava olur: c-1
ama artırılır beri c
tarafından durumda c++
, bu nedenle c
artık 12
. Sonuç olarak 11 - 12 olan 1.
EDIT: OP yanlış anlama sonrası artış oldu.
Yani aslında olan şu:
#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++
koşulda verilen işlem sırasına atıfta bulunuyor . Koşul yanlıştır, ancak daha sonra özgün değeri, c
hesaplanan c - 1
sürüm için değil, hesaplamak için kullanılır .
c++
ve arasında bir yanlış anlama olabileceğini düşünüyorum++c
c++
olduğu sonrası -increment operatör. Yapmanın c++
yan etkisi ile değeri 11'dir c == 12
. ++c
12
Üçlü Operatör'e bakın .
Sözdizimi
durum ? value_if_true: value_if_false
Yani sen yazdın
int d = (b == c++) ? (c+1) : (c-1);
Bu durumda sonuç 11 olur, çünkü kontrollerden sonra 'c' değeri artar (c + 1 = 12) ve bundan sonra 'd' değerini 11 olan c (12) -1 olarak ayarlar.
Eğer kullandıysanız, örneğin:
int d = (b == ++c) ? (c+1) : (c-1);
İfadeyi kontrol etmeden önce "c" değeri artacaktır, bu yüzden doğru olur ve "d" değeri 13 olan c (12) +1 olur.