මොකක්ද ??! ??! ක්‍රියාකරු සී වලින් කරනවාද?


1996

මේ වගේ C රේඛාවක් මම දැක්කා:

!ErrorHasOccured() ??!??! HandleError();

එය නිවැරදිව සම්පාදනය කර ඇති අතර එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ. එය දෝෂයක් සිදුවී ඇත්දැයි පරීක්ෂා කරන බවක් පෙනේ, එය තිබේ නම් එය හසුරුවයි. නමුත් එය සැබවින්ම කරන්නේ කුමක්ද හෝ එය කරන්නේ කෙසේද යන්න මට විශ්වාස නැත. ක්‍රමලේඛකයා දෝෂ පිළිබඳ ඔවුන්ගේ හැඟීම් ප්‍රකාශ කිරීමට උත්සාහ කරන බවක් පෙනේ.

මම මීට ??!??!පෙර කිසිම ක්‍රමලේඛන භාෂාවකින් දැක නැති අතර ඒ සඳහා ලියකියවිලි කොතැනකවත් සොයාගත නොහැක. (වැනි සෙවුම් වචන සඳහා ගූගල් උදව් නොකරයි ??!??!). එය කරන්නේ කුමක්ද සහ කේත නියැදිය ක්‍රියාත්මක වන්නේ කෙසේද?


44
Et පීටර් ඕල්සන්, ඔබ !ErrorHasOccurred() ??!???! HandleError();සම්පාදනය කිරීමට බලාපොරොත්තු වන්නේ කෙසේද? ඒ ??! ??? !. කාරණය ඔප්පු කරනවාද?
සීවීඑන්

31
පිරිසිදු කේතයක් කියවා බැලීමට මම යෝජනා කරමි. ErrorHasOccured () ErrorHasNotOccured () වෙත ප්‍රතිනිර්මාණය කළ යුතුය. මේ අනුව විශ්මය ජනක සලකුණ පිරිසිදු කරයි ... මේ සියලු ක්‍රියාකරුවන් තේරුම් ගැනීමට කාලය ඇත්තේ කාටද ??!
කඩෙක් එම්

17
මම කැමතියි මට වඩා ErrorHasOccured() && HandleError(). ලුආ එය කරන්නේ ද එයයි.
හියුගෝ සින්ක්

76
Ad කේඩෙක්එම්, ප්‍රතික්ෂේප කිරීම ශ්‍රිත නාමයට ගෙනයාම පිරිසිදු කේතයක් වෙනුවට ප්‍රතිවිරුද්ධ දෙයකි.
මාර්සෙල්ම්

16
ඔවුන්ගේ සෙවුම් යන්ත්‍රය සමඟ මරණයට එරෙහි සටනකින් පසු මෙහි අවසන් වූ ඕනෑම අයෙකු සඳහා සටහනක්: සංකේතාත්මක සෙවීම් සඳහා සිම්බල්හවුන්ඩ්ට උදව් කළ හැකිය.
ජාකොබ්

Answers:


1584

??!යනු trigraph පරිවර්ථන බව |. එබැවින් එය මෙසේ කියයි:

!ErrorHasOccured() || HandleError();

කෙටි පරිපථය හේතුවෙන්, මෙයට සමාන වේ:

if (ErrorHasOccured())
    HandleError();

සතියේ ගුරු (සී ++ සමඟ ගනුදෙනු කරන නමුත් මෙහි අදාළ වේ), එහිදී මම මෙය තෝරා ගත්තෙමි.

ත්‍රිකෝණවල සම්භවය හෝ @DwB අදහස් දැක්වීමේදී පෙන්වා දෙන පරිදි එය ඊබීසීඩීසී දුෂ්කර වීම (නැවත) නිසා විය හැකිය. අයිබීඑම් සංවර්ධක මණ්ඩලයේ මෙම සාකච්ඡාව එම න්‍යායට සහාය දක්වන බව පෙනේ.

ISO / IEC 9899: 1999 §5.2.1.1 සිට, පාද සටහන 12 (h / t @ Random832):

ත්‍රිකෝණාකාර අනුක්‍රමය ISO / IEC 646 හි විස්තර කර ඇති පරිදි වෙනස් නොවන කේත කට්ටලයේ අර්ථ දක්වා නැති අක්ෂර ආදානය කිරීමට ඉඩ සලසයි, එය බිටු හතේ US ASCII කේත කට්ටලයේ උප කුලකයකි.


378
ඔබේ යතුරුපුවරුව උදා: '|' සංකේතය. මෙන්න එය එක්කෝ ක්‍රමලේඛකයා හිතාමතාම කරදරකාරී වීම හෝ විකාර සංස්කාරක 'විශේෂාංගය'
මාටින් බෙකට්

36
ඔව්, එය සමානයි if (ErrorHasOccured()) HandleError(). ස්තූතියි, ඔබට සාමාන්‍යයෙන් මුණගැසෙන්නේ පර්ල් කේතයෙන් පමණි.
user786653

22
එය අනිවාර්යයෙන්ම EBCDIC නොවේ - ත්‍රිකෝණ අවශ්‍ය වන අක්ෂර මාලාව ISO-646 හි වෙනස් නොවන අක්ෂර සමූහයට හරියටම ගැලපේ (එනම් පැරණි 'ජාතික ascii' ප්‍රමිතීන්).
Random832

53
පරිපූර්ණව කියවිය හැකි විකල්පයක් වනුයේ ErrorHasOccurred() && HandleError();, ඔබ ෂෙල් ස්ක්‍රිප්ටින් කිරීමට පුරුදු වී සිටින්නේ නම්. :)
යම් මාකෝවික්

18
එය "එක්කෝ දෝෂයක් නැත හෝ ඔබ හැසිරවිය යුතුය", pSparkyRobinson ලෙස කියවන්න.
ඕමාර් ඇන්ටොලින්-කැමරෙනා

454

හොඳයි, මෙය පොදුවේ පවතින්නේ ඇයිද යන්න ඔබගේ ආදර්ශයේ පවතින්නේ මන්ද යන්නට වඩා වෙනස් විය හැකිය.

මේ සියල්ල ආරම්භ වූයේ අඩ සියවසකට පෙර දෘ c පිටපත් සන්නිවේදන පර්යන්ත පරිගණක පරිශීලක අතුරුමුහුණත් ලෙස ප්‍රතිනිර්මාණය කිරීමෙනි. ආරම්භක යුනික්ස් සහ සී යුගයේ ඒඑස්ආර් -33 ටෙලි ටයිප් විය.

මෙම උපාංගය මන්දගාමී (10 සීපීඑස්) හා is ෝෂාකාරී හා කැත වූ අතර ASCII අක්ෂර කට්ටලය පිළිබඳ එහි දැක්ම 0x5f වලින් අවසන් විය, එබැවින් එයට යතුරු කිසිවක් නොතිබුණි (පින්තූරය දෙස සමීපව බලන්න):

{ | } ~ 

නිශ්චිත ගැටළුවක් නිරාකරණය කිරීම සඳහා ත්‍රිකෝණ අර්ථ දක්වා ඇත. අදහස වූයේ සී වැඩසටහන් වලට ASR-33 හි ඇති ASCII උප කුලකය භාවිතා කළ හැකි අතර ඉහළ ASCII අගයන් නැති වෙනත් පරිසරවල ය.

ඔබේ උදාහරණය ඇත්ත වශයෙන්ම දෙකකි ??!, එක් එක් අර්ථය |, එබැවින් ප්‍රති result ලය වේ ||.

කෙසේ වෙතත්, නිර්වචනය අනුව සී කේ ලියන පුද්ගලයින්ට නවීන උපකරණ තිබේ, [ 1] එබැවින් මගේ අනුමානය නම්: යමෙකු ඒවා පෙන්වීම හෝ විනෝද වීම, ඔබට සොයා ගැනීම සඳහා කේතයේ යම් ආකාරයක පාස්කු බිත්තරයක් තැබීම.

එය නිසැකවම ක්‍රියාත්මක වූ අතර, එය ඉතා ජනප්‍රිය SO ප්‍රශ්නයකට තුඩු දුන්නේය.

ASR-33 ටෙලි ටයිප්

                                            ASR-33 ටෙලි ටයිප්


1. ඒ සඳහා, ත්‍රිකෝණ සොයාගනු ලැබුවේ ANSI කමිටුව විසිනි, එය ප්‍රථම වරට රැස්වූයේ සී පලායාමේ සාර්ථකත්වයට පත්වීමෙන් පසුවය , එබැවින් මුල් සී කේතය හෝ කෝඩර කිසිවක් ඒවා භාවිතා නොකරනු ඇත.


18
යතුරුපුවරුවේ සහ අක්‍ෂර කට්ටලයේ අක්ෂර අස්ථානගත වූ එකම අවස්ථාව එය නොවේ. කොමදෝරු 64 ඔවුන්ගේ තිස් ගණන්වල අග භාගයේ සහ ඊට වැඩි පිරිසකට වඩා හුරුපුරුදු විය හැකිය - ප්‍රදර්ශනය කරන ලද චරිතය හිඟ වරහන් (සහ බොහෝ විට බාර් සහ ටිල්ඩ් ද) සකසයි - මේ අවස්ථාවේ දී "ASCII" ASCII නොවූ නිසා . ECMA-6 හි (සෑම විටම පාහේ ASCII ලෙස හැඳින්වේ, නමුත් US-ASCII නොවේ) කලාපීය විශේෂිත කේත 18 ක් තිබුනි, නමුත් ඒවා කුමන කේතදැයි මම නොදනිමි. මට නිසැකවම පැවසිය හැකි එක් දෙයක් - බ්‍රිතාන්‍යයේ “ASCII” හි #ආදේශ කර £ඇත. වෙනත් කලාපවල, සමහර විට "ASCII" හි වරහන් ආදිය
නොතිබුණි

7
අටාරි 8-බිට් පරිගණක සඳහා සමාන ATASCII අක්ෂර කට්ටලයට {} මෙන්ම ~ සහ `ද නොතිබුණි.
dan04

42
මෙම විකිපීඩියා ලිපි දෙක බලන්න . බිට් 7 ජාතික අක්ෂර කට්ටලවල යුගය තවමත් මතක තබා ගැනීමට තරම් මම වයසින් මුහුකුරා ගියෙමි (ඒවා තවමත් අඳුරු නොකැඩූ කොන් කිහිපයක රැඳී සිටින බව මට විශ්වාසයි), සහ මම මුලින්ම සී ඉගෙන ගත් පොත ගැන අනතුරු ඇඟවීම අවශ්‍ය බව සොයා ගත්තේය. හැකියාව if (x || y) { a[i] = '\0'; }මෙන් බලා if (x öö y) ä aÄiÅ = 'Ö0'; åවැරදි අක්ෂර කට්ටලයක් දී.
ඉල්මාරි කරොනන්

9
තවත් සිත්ගන්නාසුලු note තිහාසික සටහනක් නම්, යුනික්ස් (සී පැදවූ විශාල වේදිකාව) ඕනෑම වැදගත්කමක් ඇති පළමු ක්‍රමය විය හැකි අතර (සමහර විට පළමු සමස්තයක් ලෙස) අකාරාදී අගයන් පෙරනිමි අකුරට වඩා කුඩා අකුරුවලට පෙරනිමි. සමකාලීන පද්ධති බොහොමයක් මගේ දෑසින් මා දැක නැතත්, මෙය නවීනත්වයේ සැබෑ සලකුණක් යැයි මම සිතමි. සැබවින්ම එකම යහපත් මෙහෙයුම් පද්ධතිය වීමට අමතරව, යුනික්ස් ඔබේ ඉහළ නඩුව අනෙක් අතට වඩා පහත් බවට පරිවර්තනය කළේය. ඒ කට්ටිය ඇත්තටම නියමයි.
ඩිජිටල් රෝස්

16
හාස්‍යජනක කතාව මට කියන්නට ඇත ... අයිබීඑම් ආර්එස් / 6000 වැඩපොළේ එක්ස්එල් ෆෝට්රාන් සම්පාදකය එක්ස්එල් සී සම්පාදකයාගෙන් නිපදවා ඇත. පළමු නිකුතු කිහිපය තුළදී, ඒවා වැරදීමකින් ත්‍රිකෝණාකාර සැකසුම් තුළ ඉතිරිව ඇති අතර, ඒ නිසා සී ට්‍රයිග්‍රැෆ් ලෙස වැරදි ලෙස අර්ථකථනය කරන ලද නීත්‍යානුකූල ෆෝට්රාන් අනුක්‍රමික අනුපිළිවෙලක් (වචනාර්ථයෙන් IIRC) තිබී ඇත.
ෆිල් පෙරී

166

එය සී ත්‍රිකෝණයකි . ??!වන |නිසා, ??!??!ක්රියාකරු වේ||


5
ත්‍රිකෝණය පැමිණෙන්නේ සමහර යතුරුපුවරුව සතුව දැන් ඇති සියලුම යතුරු නොමැති කාලයක සිට ය. සමහර පෙළ සංස්කාරක විසින් විශේෂ අක්ෂර සඳහා විශේෂ අක්ෂර වෙන් කර ඇති විටද එය ක්‍රියාත්මක වේ. එය බොහෝ දුරට අතීතයේ ධාතු හා
ප්‍රශ්නාවලිය සක්‍රීය කරන්නෙකි

5
සමහර යතුරුපුවරුවල "|" නොමැති බව පෙනේ එබැවින් සමහර පුද්ගලයින්ට අවශ්‍ය සංකේත ලබා දෙන ත්‍රිකෝණයක් ඇති වන තෙක් යතුරුපුවරුව නැවත නැවත හෙඩ්බට් කිරීම හැර වෙනත් විකල්පයක් නොමැත.
බකමූණ

ඊට පස්සෙ <iso646.h>ශීර්ෂ ගොනුව තියෙනවා.
ඩේවිඩ් ආර් ට්‍රිබල්

149

දැනටමත් ප්රකාශ කළ පරිදි, ??!??!අවශ්යයෙන්ම දෙකක් වේ trigraphs ( ??!හා ??!නැවත) ලබා ගැනීමට-පරිවර්තනය වෙනුවට එකට mushed ||එනම්, තාර්කික හෝ එම preprocessor විසින්.

සෑම ත්‍රිකෝණයක්ම අඩංගු පහත වගුව විකල්ප ත්‍රිකෝණ සංයෝජනයන් ව්‍යාකූල කිරීමට උපකාරී වේ:

Trigraph   Replaces

??(        [
??)        ]
??<        {
??>        }
??/        \
??'        ^
??=        #
??!        |
??-        ~

මූලාශ්‍රය: සී: යොමු අත්පොත 5 වන සංස්කරණය

එබැවින් පෙනෙන පරිදි ත්‍රිකෝණයක් ??(??)අවසානයේ සිතියම් ගත කරයි [], ??(??)??(??)ප්‍රතිස්ථාපනය වේ [][]යනාදිය ඔබට අදහස ලැබේ.

පූර්ව සැකසුම් ක්‍රියාවලියේදී ත්‍රිකෝණ ආදේශ cppකර ඇති බැවින් මෝඩ trigr.cවැඩසටහනක් භාවිතා කරමින් ප්‍රතිදානය ඔබම බැලීමට ඔබට භාවිතා කළ හැකිය :

void main(){ const char *s = "??!??!"; } 

සහ එය සමඟ සැකසීම:

cpp -trigraphs trigr.c 

ඔබට කොන්සෝල ප්‍රතිදානයක් ලැබෙනු ඇත

void main(){ const char *s = "||"; }

ඔබට පෙනෙන -trigraphsපරිදි , විකල්පය නියම කළ යුතුය, නැතිනම් cppඅනතුරු ඇඟවීමක් නිකුත් කරනු ඇත; මෙයින් ඇඟවෙන්නේ ත්‍රිකෝණ යනු අතීතයට අයත් දෙයක් වන අතර ඒවාට ගැළපෙන පුද්ගලයන් ව්‍යාකූල කිරීම හැර වෙනත් නූතන වටිනාකමක් නොමැති බවයි .


ත්‍රිකෝණ හඳුන්වාදීම පිටුපස ඇති තාර්කිකත්වය සම්බන්ධයෙන් ගත් කල , ISO / IEC 646 හි ඉතිහාස අංශය දෙස බලන විට එය වඩා හොඳින් වටහා ගත හැකිය :

ISO / IEC 646 සහ එහි පූර්වගාමියා වූ ASCII (ANSI X3.4) විදුලි සංදේශ ක්‍ෂේත්‍රයේ චරිත කේතන ක්‍රම සම්බන්ධයෙන් පවත්නා භාවිතයන් බොහෝ දුරට අනුමත කර ඇත.

ASCII ඉංග්‍රීසි හැර වෙනත් භාෂාවන් සඳහා අවශ්‍ය අක්ෂර ගණනාවක් ලබා නොදුන් බැවින්, අඩු ප්‍රභේද කිහිපයක් අවශ්‍ය අක්ෂර සමඟ ආදේශ කරන ජාතික ප්‍රභේද ගණනාවක් සාදන ලදී .

(අවධාරණය මගේ)

එබැවින්, සාරාංශයක් ලෙස, අවශ්‍ය සමහර අක්ෂර (ත්‍රිකෝණයක් පවතින) සමහර ජාතික ප්‍රභේදවල ප්‍රතිස්ථාපනය විය. මෙය වෙනත් ප්‍රභේදවල තවමත් ඇති අක්ෂර වලින් සමන්විත ත්‍රිකෝණ භාවිතා කරමින් විකල්ප නිරූපණයට මග පාදයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.