Üçlü operatör ve yazdırma


10

Aşağıdaki komutla sorun nedir

awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'

Çıktı :

awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk:                           ^ syntax error

Yanıtlar:


25

Diğer birçok programlama dili gibi, awkifadeler ve ifadeler arasında ayrım yapar. Genel olarak, ifadeler yürütülen eylemlerdir, ifadeler ise bir değer sağlayan hesaplamalardır.

İçindeki üçlü operatör awk, C'nin geldiği yerdeki karşılığı gibi, kendisi de diğer üç ifadeyi bekleyen bir ifadedir (bir ifade değil) expr1 ? expr2 : expr3. printbir ifadedir. Bir ifadenin çağrıldığı yerde kullanılamaz, dolayısıyla sözdizimi hatası.

Denedin awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'mi

İfadenin çağrıldığı bir deyimin kullanılması mantıklı değildir. İfadeler değer döndürmez. Peki sahip condition ? stmt1 : stmt2olduğunuzda üçlü operatör tarafından hesaplanan değer nedir? Eğer conditionyanlışsa, değeri olmalı stmt2ama bu bir değer değil, bir eylem.


Orada ifadeler diğer dillerdir yapmak dönüş değerleri (yakut akla gelen), ancak bu soru için mükemmel bir cevaptır.
glenn jackman

Bu açıklama için teşekkürler, @ glennjackman. Ben belki ben neden bahsettiğimi bilmiyorum ama Yorumunuzu okurken benim ilk düşüncem Yakut içinde araçlarının o tahmindi Ruby bilmiyorum tabloların tür olan ifadeler .
Celada

evet, bu işe yaramaz örnek gibi şeyler yapabilirsiniz:x = if true; print "yes"; else; print "no"; end
glenn jackman

Sanırım bu inşaat gibi bir olasılığı ortadan kaldırıyor (cond1) ? printf("str1") : printf("str2")? Üçlünün inceliklerini açıkladığınız için teşekkürler. EDIT: aslında, aşağıdaki çirkin inşaat kullanarak: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)çalışır, ama bu noktada onun kadar kompakt ve kullanımı çok daha açık eğer / else :)
isosceleswheel

Eşsiz koşullar için geçersiz satırlar yazdırmak istemiyorsanız printf kullanmayı düşünün
tuxErrante
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.