Duvida em c

Boa tarde a todos,
Estou a iniciar-me em linguagem c e estou com uma duvida.
Porque a seguinte expressao nao é valida em c?
i=j=K+1;



Obrigado.


A ver só o código assim, é difícil chegar lá... Que erro te dá concretamente?
Em C podes atribuir várias variáveis e no final da atribuição dar um valor, tipo var_a = var_b = var_c = 0; As variáveis estão declaradas?
 
A ver só o código assim, é difícil chegar lá... Que erro te dá concretamente?
Em C podes atribuir várias variáveis e no final da atribuição dar um valor, tipo var_a = var_b = var_c = 0; As variáveis estão declaradas?
Antes demais obrigado peloa resposta Miguel,
Nao tenho mais codigo, é uma pergunta de V/F, que apenas coloca esse codigo e afirma que essa instrução em c é invalida.
Acho que é valida, mas fiquei na duvida.

Obrigado.
 
Antes demais obrigado peloa resposta Miguel,
Nao tenho mais codigo, é uma pergunta de V/F, que apenas coloca esse codigo e afirma que essa instrução em c é invalida.
Acho que é valida, mas fiquei na duvida.

Obrigado.

Não é dito qual o tipo das variáveis nem nada?
Porque é assim: tal como disse tu post anterior, tu podes fazer atribuição de várias variáveis ao mesmo tempo mas no fim metes um valor (x=y=z=0 é válido). Agora a usar um valor de uma variável é que já não deve ser aceitável.

Eu acabei agora de fazer um teste:

Código:
int j = 0;
int x,y,z;

//Teste 1
x = y = z = 0;  //Compilou OK

//Teste 2
x = y = z = j+1; //Compilou OK

"uma pergunta de V/F, que apenas coloca esse codigo e afirma que essa instrução em c é invalida."

Se afirma que a instrução é inválida, então é falso a afirmação, porque a expressão é válida.
 
AVISO DESDE JA, NUNCA APRENDI C, Por isso é mais uma cena que vou lançar ao ar, do que eventualmente dar uma resposta.

Pelo que sei, o C tem de ter as variáveis declaradas desde inicio, onde o tipo tem de estar indicado.
A meu ver i=j=K+1; pode ser invalido por diversas razões.
1 - Porque não foram declaradas as variaveis.
2 - imaginando que
char i;
int j;
double or float K;

Não sei como ele compila isto, mas será que sera boa partica no fim? Imaginando que o K seria 26.42, então depois da expressão o:
i seria = 2,
j seria = a 27.

Neste caso perde-se muita coisa, o que faz a expressão pouco correta e pouco util...

Nem falo no caso de alguma variável ser do tipo string...

Mas la esta, posso estar enganado...
 
AVISO DESDE JA, NUNCA APRENDI C, Por isso é mais uma cena que vou lançar ao ar, do que eventualmente dar uma resposta.

Pelo que sei, o C tem de ter as variáveis declaradas desde inicio, onde o tipo tem de estar indicado.
A meu ver i=j=K+1; pode ser invalido por diversas razões.
1 - Porque não foram declaradas as variaveis.
2 - imaginando que
char i;
int j;
double or float K;

Não sei como ele compila isto, mas será que sera boa partica no fim? Imaginando que o K seria 26.42, então depois da expressão o:
i seria = 2,
j seria = a 27.

Neste caso perde-se muita coisa, o que faz a expressão pouco correta e pouco util...

Nem falo no caso de alguma variável ser do tipo string...

Mas la esta, posso estar enganado...


Sim, C obriga que declares as variáveis antes destas serem atribuídas e tens de indicar o tipo delas.

No entanto se as variáveis forem char e int não é problemático, porque na realidade o char guarda um inteiro de 8 bits. A serem int e double também não há problema na compilação mas perde-se a integridade do valor.

A ser string aí sim daria erro a compilar porque string é um vector de chars e terias que indicar a posição.
Imagina o seguinte caso:

Código:
char string[40];
int num;

num = string[0]; //válido e compila 
num = string;    //Inválido e erro a compilar

A pergunta não especifica tipos de variaveis nem nada do género, apenas pergunta se pode usar aquela expressão, e sim pode-se, mas não significa que seja sempre válida, tal como referiste e bem.
 
Se a pergunta for exatamente como escreveste:
entao é invalida porque nao definiste o tipo antes da expressao

se for algo do genero

int i=j=k+1;

entao é valido
 
Se a pergunta for exatamente como escreveste:
entao é invalida porque nao definiste o tipo antes da expressao

se for algo do genero

int i=j=k+1;

entao é valido

É verdade o que dizes.
No entanto, não acho que a pergunta seja disso. Para mim, está a perguntar se se pode fazer atribuição múltipla entre variáveis e sim podes fazer isso.
Mas verdade seja dita, a pergunta não está muito bem formulada na minha opinião.
 
int k = 0;
double j = 1;
int i = 2;

i = j = k;
i = k = j;

O compilador "come" ambos os casos.

A pergunta esta muitissimo mal formulada: invalida no sentido de passar no compilador ou de produzir um output incorreto?
 
int k = 0;
double j = 1;
int i = 2;

i = j = k;
i = k = j;

O compilador "come" ambos os casos.

A pergunta esta muitissimo mal formulada: invalida no sentido de passar no compilador ou de produzir um output incorreto?

E podes adicionar char aí no meio que dá correto na mesma.
A pergunta está mesmo mal formulada, tal como tinha dito.
 
Sim, C obriga que declares as variáveis antes destas serem atribuídas e tens de indicar o tipo delas.

No entanto se as variáveis forem char e int não é problemático, porque na realidade o char guarda um inteiro de 8 bits. A serem int e double também não há problema na compilação mas perde-se a integridade do valor.

A ser string aí sim daria erro a compilar porque string é um vector de chars e terias que indicar a posição.
Imagina o seguinte caso:

Código:
char string[40];
int num;

num = string[0]; //válido e compila
num = string;    //Inválido e erro a compilar

A pergunta não especifica tipos de variaveis nem nada do género, apenas pergunta se pode usar aquela expressão, e sim pode-se, mas não significa que seja sempre válida, tal como referiste e bem.
What? Porque havia de ser inválido ou dar erro a compilar?!? Isso é perfeitamente válido e super usado no C, principalmente no que toca a optimizações de baixo nível, ir buscar o ponteiro de um array para o percorrer, garantido que existe uma cópia do ponteiro original, em arrays grandes e com imensos cálculos pode-se poupar imenso em processamento.

Esse código ia dar um Warning por ser int em vez de char*, mas é só por uma questão de qualidade de código, em termos de funcionamento ia ser idêntico.
 
Última edição:
What? Porque havia de ser inválido ou dar erro a compilar?!? Isso é perfeitamente válido e super usado no C, principalmente no que toca a optimizações de baixo nível, ir buscar o ponteiro de um array para o percorrer, garantido que existe uma cópia do ponteiro original, em arrays grandes e com imensos cálculos pode-se poupar imenso em processamento.

Esse código ia dar um Warning por ser int em vez de char*, mas é só por uma questão de qualidade de código, em termos de funcionamento ia ser idêntico.

Não compila mesmo, eu experimentei e faz sentido.

num = string;

num é uma variavel do tipo inteiro e string está a ser um apontador para a primeira posição. Tu só podes atribuir pointers a variáveis de pointers. O erro que dá a compilar é mesmo o que dizes ser warning.

Aqui tens a prova

Screenshot_20171113_083602.png
 
De acordo com o standard, converter ponteiros para inteiros é possível, sendo o resultado dependente da implementação.

O erro que estás a obter deve-se provavelmente a estares a usar o gcc com target de 64 bits, ou seja ele está-se a queixar que estás a tentar converter algo de 64 bits em 32 bits.

Se estivesses numa arquitectura de 32 bits, o gcc provavelmente não se queixava (talvez com warning, não sei). Mesmo em 64 bits, se passares -fpermissive, a coisa deve passar (não testei).

Resumindo: é possível, convém saber o que se está a fazer e ler os docs. Também é possível que o compilador se queixe com mais ou menos veemencia.
 
De acordo com o standard, converter ponteiros para inteiros é possível, sendo o resultado dependente da implementação.

O erro que estás a obter deve-se provavelmente a estares a usar o gcc com target de 64 bits, ou seja ele está-se a queixar que estás a tentar converter algo de 64 bits em 32 bits.

Se estivesses numa arquitectura de 32 bits, o gcc provavelmente não se queixava (talvez com warning, não sei). Mesmo em 64 bits, se passares -fpermissive, a coisa deve passar (não testei).

Resumindo: é possível, convém saber o que se está a fazer e ler os docs. Também é possível que o compilador se queixe com mais ou menos veemencia.


Também já tinha pensado na eventualidade do pinter ser de 64bits e int apenas consegue armazenar 32. Mas a ser isso deveria dar um erro de overflow.
Não tenho a certeza, mas eu penso já ter lido que pointers (endereços de memória) apenas podem ser atribuidos a variaveis pointers, mas posso estar a fazer confusão... Logo uma variavel que armazena um endereço e outra que armazena um valor dá erro de compatibildiade (atenção não confundir com deference pointer), mas mais uma vez digo que posso estar a fazer confusão.
 
Última edição:
O C é uma linguagem de baixo nível, tu podes fazer basicamente o que tu quiseres, até podes escrever em posições de memórias de outros programas (se o souberes fazer, existem protecções para evitar isso, mas é possível dar a volta a elas), e um ponteiro não é mais que um inteiro, não faz grande sentido andar a converter coisas sem fazer um cast (nem testei nos compiladores mais recentes, o gcc 6 tem bugs muito estranhos, mas se fizeres um cast já deve funcionar em qualquer arquitectura e compilador).
 
Não compila mesmo, eu experimentei e faz sentido.

Tu compilaste em C++. O user falou em C. Em C compila, apenas dá Warning

GTAgVLB.png


Como disse o anjo, este tipo de atribuições não só é possível, como muitas vezes usado para optimização de código. Existe forma de remover os warnings, embora seja algo que eu acredito que não deve ser ensinado num nível de iniciação à programação.
Neste nível, os warnings são para ser lidos e ir à procura da razão e da melhor solução para os mesmos.

PS: Se adicionares a flag -fpermissive às flags de compilação do g++, o g++ também te permite a compilação.
 
Última edição:
Tu compilaste em C++. O user falou em C. Em C compila, apenas dá Warning

GTAgVLB.png


Como disse o anjo, este tipo de atribuições não só é possível, como muitas vezes usado para optimização de código. Existe forma de remover os warnings, embora seja algo que eu acredito que não deve ser ensinado num nível de iniciação à programação.
Neste nível, os warnings são para ser lidos e ir à procura da razão e da melhor solução para os mesmos.

PS: Se adicionares a flag -fpermissive às flags de compilação do g++, o g++ também te permite a compilação.

Um gajo está sempre a aprender. Tava mesmo na ideia que não dava de nenhuma maneira...
 
Código:
#include <stdio.h>

int main( )
{
   
   int j = 0, i = 0;
   const int K = 10;
   
   i = j = K + 1;
   printf("i:  %d    j: %d     K: %d", i, j, K);
   
    return 0;
}
 
Back
Topo