Ar i = i ++ bus dar kartą apibrėžtas C17?

Po to, kai aš suklupau į klausimą „ Kodėl šie statiniai naudoja iš anksto ir neribotą elgesį po prieaugio? “, Šiandien nusprendžiau priimti naujausią C standarto projektą, kurį galėčiau rasti ir daugiau sužinoti apie tai.
Netrukus po to, kai aptariau kitą C17 straipsnio dalį:

Išraiška yra operatorių ir operandų seka, kuri nurodo vertės apskaičiavimą arba reiškia objektą ar funkciją, arba kuri generuoja šalutinį poveikį arba atlieka jų derinį. Operatoriaus operandų reikšmių skaičiavimai suskaičiuojami, siekiant apskaičiuoti operatoriaus rezultato vertę.
Šaltinis: ISO / IEC 9899: 2017, 6.5.1 skirsnis, išraiškos

Dabar aš šiek tiek supainioti. Ar tai nereiškia, kad i = i++ konkretus elgesys? Šį kartą pažvelgiau į kitą projektą, C99:

Išraiška yra operatorių ir operandų seka, kuri nurodo vertės apskaičiavimą arba reiškia objektą ar funkciją, arba kuri generuoja šalutinį poveikį arba atlieka jų derinį.
Šaltinis: ISO / IEC 9899: 1999, 6.5.1 skirsnis "Išraiškos"

Tai praleidžia šią frazę!

Klausimai

  1. Aš kažką nesupratau?
  2. Ar atsakymai pasenę?
  3. Aš pažvelgiau į netinkamą projektą?
11
25 нояб. set asynts 25 nov. 2018-11-25 17:22 '18, 15:22 pm 2018-11-25 17:22
@ 2 atsakymai

i++ ištrauka tik sako, kad i++ ir i išraiškos apskaičiuojamos prieš apskaičiuojant pilną išraišką i = i++ . Šis elgesys vis dar yra neapibrėžtas, nes i daugiau nei vieną kartą keičiasi išraiška be sekos taško.

Ši eilutė pirmą kartą pasirodė C11 , taigi, palyginti su šia C17 versija, jokių pakeitimų nėra.

7
25 нояб. atsakymą pateikė dbush lapkričio 25 d 2018-11-25 17:27 '18, 18:27 pm 2018-11-25 17:27

Visa istorija. C99 versijoje turėjome šį 6.5.16 priskyrimo pareiškimo tekstą:

Tarp ankstesnio ir kito sekos taško turi atsirasti šalutinis kairiojo operando vertės atnaujinimo efektas.

Operandų vertinimo tvarka nenurodyta. Jei bandoma pakeisti priskyrimo ataskaitos rezultatą arba pasiekti jį po kito sekos taško, elgesys yra neapibrėžtas.

Tai buvo pakeista C11:

Apskaičiuojant kairiojo ir dešiniojo operando vertę, nustatomas kairiojo operando išsaugotos vertės atnaujinimo šalutinis poveikis. Operatorių vertinimai nėra nuoseklūs.

Tai tik kitokia (ir dar blogesnė) formuluotė, abi versijos elgiasi taip pat - raktas yra paskutinis sakinys C11 dalyje, kuris vis dar atlieka šį neribotą elgesį, nes kairiojo operando skaičiavimas vis dar nėra užsakomas pagal tinkamą operandą. Vertės apskaičiavimas taikomas tik atskiriems operandams.

C17 tekstas yra toks pat kaip C11. Taigi atsakymas yra: ne, i = i++; vis dar neribotas elgesys C17.


Palyginimui palyginkite tai su C ++ 11 (5.17):

Visais atvejais priskyrimas atliekamas apskaičiuojant dešiniųjų ir kairiųjų operandų vertę ir prieš apskaičiuojant priskyrimo išraiška.

Tai yra apie tą patį tekstą, kaip ir C11, be aiškaus „operandų skaičiavimo, kurie nėra sekvenuoti“. Tai buvo „C ++ 11“ trūkumas, nėra aišku, ar ji padarė tam tikrų aiškių paaiškinimų, ar ne.

C ++ 17 pateikia paaiškinimą (8.5.18):

Visais atvejais priskyrimas atliekamas apskaičiuojant dešiniųjų ir kairiųjų operandų vertę ir prieš apskaičiuojant priskyrimo išraiška. Tinkamas operandas užsakomas prieš kairįjį operandą.

Taigi, C ++ 17 i=i++; aiškiai apibrėžta. Ir, kaip matome, formuluotė yra aiški, kitaip nei „nesuderinamumas“ C11 / C17.

2
26 нояб. atsakymą pateikė Lundin 26 lapkritis 2018-11-26 11:03 '18, 11:03 ; 2018-11-26 11:03

Peržiūrėti kitus klausimus apie žymes > arba Užduoti klausimą