Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

guidjos

Aprendendo C

Recommended Posts

Pessoal, boa tarde.

 

Nos últimos anos falei com muita gente que queria aprender C. Seguem os conselhos que tenho, baseado nos casos de sucesso que eu testemunhei.

 

Se for aprender C, sugiro que leia The C Programming Language (segunda ed.), de Brian Kernigham e Dennis Ritchie. São os criadores da linguagem, e o apelido do livro, "K&R", é por causa de suas iniciais. O livro é pequeno. Os autores mostraram uma capacidade incrível de descrever em tão poucas páginas tantos aspectos de C de forma correta.

 

Ao contrário do que se pensa, C não é simples. Na verdade, é tão complexa que a maioria das pessoas não sabe que não a conhecem. Se estiver à procura de um desafio, creio sim que C seja uma boa oportunidade. Depois de ler o K&R, resolvendo os exercícios (alguns são difíceis), sugiro que dê uma olhada no material que escrevi: http://guipn.com/tac.htm

 

Sempre lembre-se de alguns fatos-chave:

 

1. Ao contrário do que é comum pensar, C++ não é um superconjunto de C; são linguagens bem distintas.

2. Programas em C podem ser não-determinísticos (para entender por quê, leia a seção sobre behavior o material que linkei acima).

3. Seja focado(a) e perseverante. Seja paciente e aprenda com calma. As centenas de pessoas que vi se apressarem (incluindo eu) tiveram problemas para entender aspectos mais sutis/complexos por precipitação nas conclusões.

 

Finalmente, depois de ter alguma solidez no conhecimento da linguagem, e se quiser exercer bom domínio sobre ela, duvide das assertivas que encontrar. Quando encontrar alguma afirmação sobre seu funcionamento, esforce-se para provar que ela está errada. Faça isto pesquisando nos draft standards, e apontando regras descritas ali que contradigam a assertiva em questão. Exemplo:

 

Assertiva-exemplo: "objetos de tipo (char) têm 8 bits."

 

Esta assertiva é falsa. O tipo (char) pode ter mais de 8 bits.

 

Prova:

 

6.2.6 Representations of types

6.2.6.1 General

(...) 49) A byte contains CHAR_BIT bits' date=' and the values of type unsigned char range from 0 to 2 ^ (CHAR_BIT - 1)

 

[b']5.2.4.2.1 - Sizes of integer types[/b]

The values given below shall be replaced by constant expressions (...). Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.

 

— number of bits for smallest object that is not a bit-field (byte)

CHAR_BIT 8

(...)

 

Se não conseguir uma contra-prova, leia as partes do draft standard que descrevem as entidades relacionadas à assertiva. Veja se, baesado(a) na sua interpretação, você agora concorda com o que ela propõe. Se não concordar, converse com outros estudantes da linguagem e/ou membros do comitê que a define.

 

Boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom o teu artigo, parabéns. Realmente me fez perceber que em C, de 0 à 100, só conheço 0,00001% :)

Nunca me interessei muito em ler as especificações da linguagem em C, em especial a C99.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo com tudo o que disse, exceto ao dizer que o tipo char tem mais de 8 bits.


Assertiva-exemplo: "objetos de tipo (char) têm 8 bits."
Esta assertiva é falsa. O tipo (char) pode ter mais de 8 bits.

Você mostrou "prova" em texto, agora falta a prova em programação.

The C Programming Language:

The qualifier signed or unsigned may be applied to char or any integer. unsigned numbers
are always positive or zero, and obey the laws of arithmetic modulo 2n, where n is the number
of bits in the type. So, for instance, if chars are 8 bits, unsigned char variables have values
between 0 and 255, while signed chars have values between -128 and 127 (in a two's
complement machine.) Whether plain chars are signed or unsigned is machine-dependent, but
printable characters are always positive.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Concordo com tudo o que disse, exceto ao dizer que o tipo char tem mais de 8 bits.

Não foi dito que o tipo char tem mais de 8 bits. Foi dito que ele pode ter mais de 8 bits. São coisas bem diferentes.

 

A ideia de que isso precisa ser provado como se fosse algo passível de ser falso não faz sentido algum.

O que foi postado foi a especificação da linguagem. E mesmo ela reconhece que é possível existir uma arquitetura na qual um char não tenha 8 bits ou uma palavra não seja composta de 32 bits ou 64 bits, como aconteceu no passado e provavelmente ainda acontece (http://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char)

 

(Para os que não estão entendendo: não existe somente arquiteturas de 32 bits e 64 bits. No ENIAC, uma palavra possuía 10 bits. No PDP-10, era de 36 bits. No PDP-15, 18 bits)

Compartilhar este post


Link para o post
Compartilhar em outros sites

E mesmo ela reconhece que é possível existir uma arquitetura na qual um char não tenha 8 bits ou uma palavra não seja composta de 32 bits ou 64 bits, como aconteceu no passado e provavelmente ainda acontece (http://stackoverflow...than-8-bit-char)

 

 

Se em outras arquiteturas o tamanho muda isso não é padrão da linguagem...

Existe um padrão justamente para evitar esse tipo de variáções. O Padrão ANSI determina que um char tem e deve ser 8 bits.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Por isso que na especificação da linguagem diz que um char pode ter mais de 8 bits...
O padrão determina que um char tem exatamente 8 bits e não pode haver variações de arquitetura? Vamos ver:
C11:

The contents of the header <limits.h> are given below, in alphabetical order. The minimum magnitudes shown shall be replaced by implementation-defined magnitudes with the same sign. The values shall all be constant expressions suitable for use in #if preprocessing directives. The components are described further in 5.2.4.2.1.
#define CHAR_BIT 8 (...)
5.2.4.2.1 Sizes of integer types <limits.h>
The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer
promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
- number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
Nope. CHAR_BIT = 8 é o valor mínimo. Está no texto do padrão da linguagem: "os valores dependentes da implementação devem ser iguais OU MAIORES". Portanto, um char pode, sim, possuir mais de 8 bits.
C99:

All objects in C must be representable as a contiguous sequence of bytes, each of which is at least 8 bits wide.
A char whether signed or unsigned, occupies exactly one byte.
(Thus, for instance, on a machine with 36-bit words, a byte can be defined to consist of 9, 12, 18,
or 36 bits, these numbers being all the exact divisors of 36 which are not less than 8.)
Ou seja, o padrão ISO C99 determina que um char ocupa exatamente 1 byte e ao mesmo tempo determina que 1 byte deve conter no mínimo 8 bits. Não fala nada sobre limites superiores na quantidade de bits que definem 1 byte. E ainda dá exemplo de outras arquiteturas, nas quais 1 byte possui mais de 8 bits.
C89 (também conhecido como ANSI C):

Byte --- the unit of data storage in the execution environment large enough to hold any member of the basic character set of the execution environment. It shall be possible to express the address of each individual byte of an object uniquely. A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit.
(...)
Character --- a single byte representing a member of the basic character set of either the source or the execution environment.
ANSI C também diz que o número de bits que compõem 1 byte é variável, dependente da implementação.
O único padrão que conheço que restringe o tamanho de 1 byte a 8 bits é o POSIX:

Byte
An individually addressable unit of data storage that is exactly an octet, used to store a character or a portion of a character; see also Character. A byte is composed of a contiguous sequence of 8 bits. The least significant bit is called the "low-order" bit; the most significant is called the "high-order" bit.
Note:
The definition of byte from the ISO C standard is broader than the above and might accommodate hardware architectures with different sized addressable units than octets.
Character
A sequence of one or more bytes representing a single graphic symbol or control code.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.