A C-- típusrendszerének mindössze két célja van. A C-- -ban két típus van:
A nyelv nem támogatja sem az implicit sem az explicit típuskonverziót.
Mint a gépi utasítások, a C-- programok is a regisztereket és a memóriát kezelik. A változók olyanok mint a regiszterek, nincs címük és egy változónak való értékadás nem változtathatja meg egy másik értékét. A változók lehetnek lokálisok egy eljárásban, de a C-- támogatja a globális regiszter változókat, melyeken az összes eljárás osztozik.
A konstansok az alábbi EBNF-el adhatók meg:
Egy C-- kifejezés lehet egy literál, egy név, egy referencia egy memóriabeli értékre vagy egy primitív operátor más kifejezésekre alkalmazva. Egy C-- kifejezés kiértékelése vagy egy k-bites értéket vagy egy logikai feltételt eredményez. Az értékek tárolhatók változókban, átadhatók paraméterekként, visszaadhatók eredményekként és lekérdezhetők vagy tárolhatók a memóriában. Egy kifejezés ami egy k-bites értéket eredményez bitsk típusú, amely pedig logikai feltételt az bool típusú. Mint egy assemblerben, a különbségek előjeles és előjel nélküli egészek, mutatók és lebegő-pontos értékek között az operátorokban vannak, nem az operandusok típusaiban.
A nyelvben 75 primitív operátor van. Minden primitív operátor egy értéket eredményez, melynek típusát és méretét az operátor neve és az operandusok típusa és mérete határozza meg. A primitív operátorok mellékhatásoktól mentesek, tehát nem változtatják meg a memória vagy a regiszterek tartalmát.
A primitív operátorok szintaxisa a következő: