{"id":6666,"date":"2011-04-15T10:32:31","date_gmt":"2011-04-15T08:32:31","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6666"},"modified":"2011-10-05T12:22:40","modified_gmt":"2011-10-05T10:22:40","slug":"8-costrutti-decisionali","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/8-costrutti-decisionali\/","title":{"rendered":"8. Costrutti decisionali"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-00.jpg\" alt=\"corso-completo-c-Costrutti-decisionali-00\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6669\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-00.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-00-150x75.jpg 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/a> Nella precedente lezione ci eravamo lasciati parlando di operatori logici e relazionali e vi avevo detto che avremmo fatto qualche esempio di utilizzo nella prossima lezione, ed eccoci qui.<\/p>\n<p>Il motivo per cui non ho scritto alcun esempio basato su questi operatori \u00e8 che ancora non abbiamo imparato come far prendere delle decisioni ai nostri programmi, quindi valutare se una variabile \u00e8 vera o falsa senza poi saper prendere delle decisioni a riguardo \u00e8 praticamente inutile.<br \/>\n<!--more--><\/p>\n<h4>if&#8230;else<\/h4>\n<p>Il costrutto <em>if&#8230;else<\/em> (traduzione: se&#8230;altrimenti) \u00e8 sicuramente il costrutto decisionale pi\u00f9 utilizzato, spesso viene citato semplicemente come costrutto <em>if<\/em>.<\/p>\n<p>Un linguaggio di programmazione che non abbia la possibilit\u00e0 di prendere una decisione praticamente non \u00e8 un linguaggio di programmazione.<\/p>\n<p>Ricordate l&#8217;algoritmo per preparare il t\u00e8 visto nella <a href=\"http:\/\/www.devapp.it\/wordpress\/2-introduzione-alla-programmazione-algoritmi-e-diagrammi-di-flusso.html\" target=\"_blank\">seconda lezione<\/a>? Quel rombo al centro \u00e8 proprio il simbolo del costrutto decisionale, se \u00e8 vera una data condizione il programma esegue delle operazioni, se invece \u00e8 falsa allora ne esegue delle altre.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-01.jpg\" alt=\"corso-completo-c-Costrutti-decisionali-01\" width=\"503\" height=\"580\" class=\"aligncenter size-full wp-image-6668\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-01.jpg 503w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-Costrutti-decisionali-01-260x300.jpg 260w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><\/a><\/p>\n<p>la sintassi del costrutto if \u00e8 la seguente:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (espressione) {\r\n\r\n    istruzioni...\r\n\r\n    istruzioni...\r\n\r\n    ...\r\n\r\n}\r\n\r\nelse {\r\n\r\n    istruzioni...\r\n\r\n    istruzioni...\r\n\r\n    ...\r\n\r\n}\r\n<\/pre>\n<p>Come si pu\u00f2 facilente intuire il costrutto if valuta l&#8217;espressione tra parentesi e se questa risulta essere vera esegue le istruzioni immediatamente successive, se invece l&#8217;espressione \u00e8 falsa allora esegue le istruzioni contentute nel blocco che segue la parola <em>else<\/em>.<\/p>\n<p>Ma cosa pu\u00f2 essere inserito come espressione? Pu\u00f2 essere inserito tutto quello che in qualche modo restituisce un valore vero\/falso, siano esse singole istruzioni o combinazioni di istruzioni.<\/p>\n<p>Facciamo qualche esempio:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint anni = 42;\r\n\r\nif  (anni &lt; 100 ) {\r\n\r\n    printf(&quot;Hei, sei ancora un giovanotto!\\n&quot;);\r\n\r\n}\r\n\r\nelse {\r\n\r\n    printf(&quot;Quanto spendi in candeline??\\n&quot;);\r\n\r\n}\r\n<\/pre>\n<p>oppure<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint saldoconto = 1000;\r\n\r\nint speseOrdinarie = 100;\r\n\r\nint speseStraordinarie = 300;\r\n\r\nif ((speseOrdinarie + speseStraordinarie) &lt;= saldoconto ) {\r\n\r\n    printf(&quot;Non sei ancora sul lastrico\\n&quot;);\r\n\r\n}\r\n\r\nelse {\r\n\r\n    printf(&quot;Meglio cercare di rudurre le spese!!\\n&quot;);\r\n\r\n}\r\n<\/pre>\n<p>In questo secondo esempio ho utilizzato una combinazione di istruzioni, ed ho utilizzato delle parentesi, anche se non erano necessarie visto che l&#8217;operatore &#8220;+&#8221; ha una maggiore priorit\u00e0 rispetto al &#8220;&lt;=&quot;, per facilitare la comprensione del codice.<\/p>\n<p>Vediamo un altro esempio:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint temperatura = 38;\r\n\r\nif ((temperatura &gt;= 38) &amp;&amp; (temperatura &lt;= 40)) {\r\n\r\n    printf(\"Hai la febbre, dovresti prendere qualcosa!\");\r\n\r\n}\r\nif ((temperatura &gt;= 36) &amp;&amp; (temperatura &lt; 38)) {\r\n    printf(\"Temperatura nella norma\");\r\n}\r\nif (temperatura &gt; 40) {\r\n\tprintf(\"Febbre alta! chiama il medico\");\r\n}\r\nif (temperatura &lt; 36) {\r\n\r\n    prinf(&quot;Ipotermia??&quot;);\r\n\r\n}\r\n\r\n}\r\n<\/pre>\n<p>In questo esempio ho invece utilizzato l&#8217;operatore logico AND (&amp;&amp;) per assicurarmi che le due condizioni siano entrambe vere, inoltre all&#8217;interno del blocco di codice else ho utilizzato altri costrutti if, creando quelli che si chiamano if annidati.<\/p>\n<h4>Attenti alle insidie<\/h4>\n<p>Un errore molto comune che capita davvero spesso \u00e8 il seguente:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint temperatura = 25;\r\n\r\nif (temperatura = 0)\r\n\r\n{\r\n\r\n    printf(\"Freddissimo! ci sono %d gradi\",temperatura);\r\n\r\n}\r\n\r\nelse {\r\n\r\n    printf(\"Non ci sono zero gradi, ma %d gradi\",temperatura);\r\n\r\n}\r\n<\/pre>\n<p>Leggendo il codice precedente potremmo pensare che l&#8217;output di questo codice sia &#8220;Freddissimo! ci sono 25 gradi&#8221; visto che la temperatura \u00e8 stata inizializzata a 25 e sicuramente 25 non \u00e8 uguale a 0. Per\u00f2 se proviamo a compilare questo codice il messaggio \u00e8 uno strano &#8220;Non ci sono zero gradi, ma 0 gradi&#8221; che cosa \u00e8 successo? Purtroppo abbiamo confuso l&#8217;operatore logico &#8220;==&#8221; con l&#8217;operatore di assegnamento &#8220;=&#8221; (vi avevo avvisato nella <a href=\"http:\/\/www.devapp.it\/wordpress\/7-operazioni-matematiche-e-logiche.html\" target=\"_blank\">precedente lezione<\/a>! Avreste dovuto notarlo!) L&#8217;operatore di assegnamento in C da come valore di ritorno il valore assegnato (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Assignment_%28computer_programming%29#Assignment_versus_equality\" target=\"_blank\">link<\/a>), quindi in realt\u00e0 l&#8217;espressione prima assegna a temperatura il valore 0, poi ritorna zero perch\u00e9 \u00e8 il valore assegnato quindi una volta analizzata l&#8217;espressione il costrutto if diventa<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint temperatura = 25;\r\n\r\nif (0)\r\n\r\n{\r\n\r\n    printf(\"Freddissimo! ci sono %d gradi\",temperatura);\r\n\r\n}\r\n\r\nelse {\r\n\r\n    printf(\"Non ci sono zero gradi, ma %d gradi\",temperatura);\r\n\r\n}\r\n<\/pre>\n<p>Come abbiamo visto il valore 0 in C identifica il FALSO, quindi vengono eseguite le istruzioni contenute all&#8217;interno del blocco di codice else.<\/p>\n<p>Adesso che avete capito l&#8217;errore provate ad esaminare questo codice:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint t = 0;\r\nif (t = 25) {\r\n printf(\"Temperatura gradevole, ci sono %d gradi\",t);\r\n}\r\nelse {\r\n printf(\"Non ci sono certo 25 gradi! ce ne sono %d\",t);\r\n}\r\n<\/pre>\n<p>e provate a spiegare perch\u00e9 questa volta, invece, il messaggio di output \u00e8 &#8220;Temperatura gradevole, ci sono 25 gradi&#8221;<\/p>\n<h4>Varianti di if&#8230;else<\/h4>\n<p>Quella che abbiamo esaminato fino ad ora \u00e8 la struttura standard del costrutto if, ma esisono alcune piccole varianti, le varianti non sono indispensabili, qualsiasi programma pu\u00f2 essere scritto utilizzando solo la versione base del costrutto if, queste ultime, per\u00f2, aiutano a scrivere codice pi\u00f9 comprensibile.<\/p>\n<p><strong>if con una sola istruzione<\/strong><\/p>\n<p>Se il vostro blocco di codice \u00e8 composto da una singola istruzione le parentesi graffe possono essere omesse. Ad esempio la seguente sintassi \u00e8 perfettamente ammessa:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (credito &gt; 0)\r\n\r\n    printf(\"Puoi ancora telefonare\");\r\n\r\nelse\r\n\r\n    printf(\"Hai esaurito il credito\");\r\n<\/pre>\n<p><strong>if senza else<\/strong><\/p>\n<p>ll costrutto else \u00e8 opzionale, non sempre \u00e8 necessario fare qualcosa se il risultato dell&#8217;espressione \u00e8 falso. In questo caso \u00e8 lecito scrivere:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint numerofattura = 1000;\r\n\r\nif (numerofattura == 1000)\r\n\r\n    printf(\"Sei il cliente num. 1000!!!\");\r\n\r\n...altre istruzioni...\r\n\r\n...altre istruzioni...\r\n<\/pre>\n<p>Da notare che questa sintassi si presta a molti possibili fraintendimenti perch\u00e9 solo l&#8217;indentazione chiarisce  qual&#8217;\u00e8 l&#8217;istruizione che sta &#8220;dentro&#8221; l&#8217;if  e quali invece vengono eseguite indipendentemente dal risultato dell&#8217;espressione. Qualcuno per questo motivo preferisce scrivere il codice precedente tutto su una riga:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint numerofattura = 1000;\r\n\r\nif( numerofattura == 1000) printf(\"Sei il cliente num. 1000!!!\");\r\n\r\n...altre istruzioni...\r\n\r\n...altre istruzioni...\r\n<\/pre>\n<p>ma non \u00e8 uno stile che io gradisco, io di solito aggiungo lo stesso le parentesi graffe, anche quando potrebbero essere omesse, in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint numerofattura = 1000;\r\n\r\nif (numerofattura == 1000) {\r\n\r\n    printf(\"Sei il cliente num. 1000!!!\");\r\n\r\n}\r\n\r\n...altre istruzioni...\r\n\r\n...altre istruzioni...\r\n<\/pre>\n<p><strong>if&#8230;else if&#8230;else<\/strong><\/p>\n<p>In alcuni casi si pu\u00f2 avere la necessit\u00e0 di distinguere tra pi\u00f9 di due valori, in questo caso si pu\u00f2 utilizzare il costrutto <em>if&#8230;else if&#8230;else<\/em> la sua sintassi \u00e8 la seguente:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (espressione) {\r\n\r\n    ...istruzioni...\r\n\r\n    ...istruzioni...\r\n\r\n}\r\n\r\nelse if (espressione) {\r\n\r\n    ...istruzioni...\r\n\r\n    ...istruzioni...\r\n\r\n}\r\n\r\nelse {\r\n\r\n    ...istruzioni...\r\n\r\n    ...istruzioni...\r\n\r\n}\r\n<\/pre>\n<p>Vengono valutate le espressioni dall&#8217;alto verso il basso e quando la prima espressione risulta vera il programma esegue le istruzioni contenute nel blocco di codice corrispondente. Terminato il blocco di istruzioni salta direttamente alla prima istruzione che segue il blocco <em>if&#8230;else if&#8230;else<\/em> (non esegue mai due blocchi di codice anche se le relative espressioni risultano entrambe vere). Se nessuna espressione risulta vera viene eseguito infine il codice all&#8217;interno del blocco else. Il blocco else \u00e8 per\u00f2 facoltativo.<\/p>\n<p>Con questa sintassi l&#8217;esempio precedente sulla temperatura corporea potrebbe essere riscritto in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (temperatura &lt; 36) {\r\n\tprintf(\"Sei in ipotermia\");\r\n}\r\nelse if ( (temperatura &gt;= 36) &amp;&amp; (temperatura &lt; 38) ) {\r\n\tprintf(\"Temperatura normale\");\r\n}\r\nelse if ( (temperatura &gt;= 37) &amp;&amp; (temperatura &lt;= 40) ){\r\n\tprintf(\"Hai la febbre, dovresti prendere qualcosa\");\r\n\r\nelse if (temperatura &gt; 40) {\r\n\tprintf(\"Hai la febbre alta, chiama un medico\");\r\n}\r\n<\/pre>\n<h4>Costrutto switch-case-default<\/h4>\n<p>Un secondo costrutto decisionale \u00e8 il costrutto <em>switch-case-default<\/em>, non \u00e8 un costrutto indispensabile, pu\u00f2 essere simulato con una serie di <em>if<\/em> annidati, ma alle volte pu\u00f2 essere comodo e rendere il codice pi\u00f9 leggibile. La sua sintassi \u00e8 la seguente<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nswitch (variabile)\r\n{\r\ncase valore1:\r\n\r\n...istruzione...\r\n\r\nbreak;\r\ncase valore2:\r\n\r\n...istruzione...\r\n\r\nbreak;\r\ncase valore3:\r\n\r\n...istruzione...\r\n\r\nbreak;\r\ndefault:\r\n\r\n...istruzioni...\r\n}\r\n<\/pre>\n<p>Quello che fa \u00e8 esaminare il valore di una variabile e, a seconda del valore, eseguire le istruzioni corrispondenti. Attenzione all&#8217;istruzione break: \u00e8 indispensabile, se omessa il codice eseguir\u00e0 anche le istruzioni contenute negli altri blocchi (si, lo so \u00e8 un comportamento anomalo, infatti non amo molto questo costrutto). Se nessun case corrisponde al valore della variabile viene eseguito il codice all&#8217;interno del blocco <em>default<\/em>, blocco che \u00e8 facoltativo.<\/p>\n<h4>Operatore ternario<\/h4>\n<p>L&#8217;operatore ternario ha la stessa funzione del costrutto <em>if&#8230;else<\/em>, ma \u00e8 pi\u00f9 sintetico e potete utilizzarlo quando dovete eseguire una sola operazione. La sua sintassi \u00e8 la seguente<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nespressione ? ..istruzione se vera : ..istruzione se falsa\r\n<\/pre>\n<p>In pratica valuta l&#8217;espressione e se risulta vera esegue l&#8217;istruzione immadiatamente successiva, viceversa esegue l&#8217;istruzione che segue i due punti. \u00c8 equivalente a:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (espressione)\r\n    istruzione;\r\nelse\r\n    istruzione;\r\n<\/pre>\n<p>Vediamo questo costrutto in un esempio pratico:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint a = 10;\r\nint b = 5;\r\nint massimo;\r\nmassimo = (a &gt; b) ? a : b;\r\n<\/pre>\n<h4>Prossimamente<\/h4>\n<p>Nella prossima lezione parleremo dei costrutti iterativi for, while e until.<\/p>\n<h4>Letture consigliate:<\/h4>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" title=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7803\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><strong>Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica) <\/strong><\/a><br \/>\n<em>Brian W. Kernighan &#8211; Dennis M. Ritchie<\/em><br \/>\n<strong>Editore:<\/strong> Pearson | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 313 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 27,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 22,95 con Spedizione gratuita<\/p>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" title=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7550\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><strong>C. Corso completo di programmazione<\/strong><\/a><br \/>\n<em>Paul J. Deitel &#8211; Harvey M. Deitel<\/em><br \/>\n<strong>Editore:<\/strong> Apogeo | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 640 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 39,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 33,15 con Spedizione gratuita<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nella precedente lezione ci eravamo lasciati parlando di operatori logici e relazionali e vi avevo detto che&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[569],"tags":[593,588,703,704,241,706,705],"class_list":["post-6666","post","type-post","status-publish","format-standard","hentry","category-corso-completo-di-c","tag-corso-completo-di-c-2","tag-corso-di-c","tag-costrutti-decisionali-c","tag-if-else-c","tag-ignazio-calo","tag-operatore-ternario-c","tag-switch-case-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6666"}],"version-history":[{"count":13,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6666\/revisions"}],"predecessor-version":[{"id":7812,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6666\/revisions\/7812"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}