Přiřazení hodnoty ve stavu, zatímco smyčky

hlasů
12

I našel tento kus kódu na Wikipedii.

#include <stdio.h>

int main(void)
{
  int c;

  while (c = getchar(), c != EOF && c != 'x')
  {
    switch (c)
      {
      case '\n':
      case '\r':
        printf (Newline\n);
        break;
      default:
        printf (%c,c);
      }
  }
  return 0;
}

Jsem zvědavý výraz použitý jako podmínku while:

while (c = getchar(), c != EOF && c != 'x')

Je zcela zřejmé, co to dělá, ale nikdy jsem tuto konstrukci neviděl. Je to specifická při pobytu smyčku? Pokud tomu tak není, jak se analyzátor / kompilátor určit, která strana oddělených čárkou výraz vrátí logickou hodnotu , zatímco smyčky?

Položena 16/07/2009 v 09:09
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
16

Čárkou je binární operátor, který vyhodnocuje první operand a vyřadí výsledek, se pak vyhodnotí druhý operand a vrátí tuto hodnotu.

To je také „posloupnost bod“ , což znamená, že všechny nežádoucí účinky budou vypočítány před další část kódu je vykonán.

Odpovězeno 16/07/2009 v 09:12
zdroj uživatelem

hlasů
1

Čárka je operátorem. Vrací hodnotu pravého výrazu ruky ve výchozím nastavení . Pořadí vyhodnocování je zaručeno, že zůstane první a pak doprava.

UPDATE (odpověď na PAX poznámka):

Stejně jako většina operátorů, může být přetížen pro uživatelem definované typy:

#include <iostream>
#include <string>
using namespace std;

enum EntryType { Home, Cell, Address };

class AddressBookEntryReference {
public:
    AddressBookEntryReference(const string& name, const EntryType &entry)
        : Name(name), Entry(entry) { }
    string Name;
    EntryType Entry;
};

AddressBookEntryReference operator,(const string& name, const EntryType &type) {
    return AddressBookEntryReference(name, type);
}

class AddressBook {
    string test;
public:
    string& operator[](const AddressBookEntryReference item) {
        // return something based on item.Name and item.Entry.

        // just to test:
        test = item.Name;
        return test;
    }
};

int main() {
    // demo:
    AddressBook book;
    cout << book["Name", Cell]  // cool syntax! 
         << endl;
}
Odpovězeno 16/07/2009 v 09:12
zdroj uživatelem

hlasů
4

V mnoha jazycích čárka je operátor, který vždy vede k hodnotě druhého operandu. Operandy se vyhodnocují postupně zleva doprava.

Pseudo kód:

a = 10
print a = 7 + 8, a * 2

Poznámka: printje považováno za prohlášení, že nebere argumenty, takže to, co přichází poté, co je považováno za jediný výraz a = 7 + 8, a * 2.

Proveden takto:

  • První řada
    • dát 10doa
  • druhý řádek
    • vyhodnotit 7 + 8( 15)
    • dát vyhodnocuje hodnotu ( 15) va
    • vyhodnotit a * 2( 30)
    • vyhodnotí ,operátor s operandy 15a 30:
      • vždy hodnota druhého operandu ( 30)
    • vytisknout vyhodnocuje hodnotu ( 30)
Odpovězeno 16/07/2009 v 09:12
zdroj uživatelem

hlasů
10

Operátor čárka je divný beastie až se dostanete k tomu rozumím, a to není specifické while.

Výraz:

exp1, exp2

vyhodnocuje exp1pak vyhodnocuje exp2a vrací se exp2.

Vidíte to často, i když to nemusí uvědomovat:

for (i = j = 0; i < 100; i++, j += 2)

Nejste vlastně používat návratovou hodnotu "i++, j += 2", ale je to tam nicméně. Operátor čárka vyhodnotí oba bity upravit tak ii j.

Můžete docela dobře používat jej kdekoliv může být použit běžný výraz (tj čárkami uvnitř volání funkce, je to operátor čárka, například) a je to velmi užitečné při psaní kompaktní zdrojový kód, pokud je to to, co se vám líbí. Tímto způsobem, je součástí rodiny, která umožňuje věci jako:

while ((c= getchar()) != EOF) {...}
i = j = k = 0;

a tak dále.

Pro konkrétní příklad:

while (c = getchar(), c != EOF && c != 'x')

z následujících případů:

  • c = getchar() je proveden zcela (operátor čárka je sekvence bod).
  • c != EOF && c != 'x' provedeny.
  • operátor čárka zahazuje první hodnotu (c) a „vrací“ druhé.
  • na whilepoužití, které vracejí hodnotu pro řízení smyčky.
Odpovězeno 16/07/2009 v 09:14
zdroj uživatelem

hlasů
2

Expandovat trochu na další odpovědi, v tomto kódu:

EXPRESSION_1 , EXPRESSION_2

EXPRESSION_1 nejprve hodnoceny, pak existuje posloupnost bod, pak EXPRESSION_2 je vyhodnocen a hodnota celé věci je hodnota EXPRESSION_2.

Pořadí provozu záruky a pořadí bod jsou oba na kód, který citoval důležité. Společně pak znamená, že si můžeme být jisti, že funkce getchar () se zavolá a hodnota proměnné C je plně aktualizováno před testuje hodnotu cca.

Odpovězeno 16/07/2009 v 09:17
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more