c语言int k=10; for(;!k;k--)printf("%d",k--)为啥无答案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言int k=10; for(;!k;k--)printf("%d",k--)为啥无答案相关的知识,希望对你有一定的参考价值。

因为k是10(非0)换成bool型就是true。!k就是false。for里面的第二部分是如果条件为真才执行,所以for里面的内容不执行 参考技术A for(;!k;k--) 执行的 条件是 !k 是真才行,现在k=10 系统默认形式是k>0为真,那么现在!k 就是假了,所以循环不会执行的 参考技术B k等于10为真,在C语言中0为假,非0都为真。在 for(;!k;k--)循环这一步中,执行了!k(取反)运算,真的就为假,假的就为真。因为原来10为真嘛,取反后为假。

而整个循环需要 for(;!k;k--)中间的那个表达式为真才会执行,但是此时那部分却为假了,自然后面的代码就不执行了。

楼主可以这样试下吧k=0试试,此时为假,取反为真,循环就执行了

C语言错误:left operand must be l-value

#include <stdio.h>
int main()

int a[6],*k,i;
void sort(int *p,int n);
k=a;
printf("please enter 6 numbers:\n");
for(i=0;i<6;i++)
scanf("%d",k++);
k=a;
sort(k,6);
for(i=0;i<6;i++)
printf("%d ",*k++);
return 0;

void sort(int *p,int n)

int i,j,temp;
for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

if(*p+i>*p+j)
temp=*p+i;*p+i=*p+j;*p+j=temp; 这行提示:error C2106: '=' : left operand must be l-value


return;

error C2106: '=' :left operand must be l-value 表示等号左边必须为一个左值,该处错误为等号左边为*p+i\\j是表达式,不是一个左值。

问题分析

C语言的符号优先级表格(部分)如下表:

由该表格可知取值符 * 运算优先级高于加法运算符 +,因此 *p+i 和 *p+j 的运算均为先取值再加上变量,结果为一个数值,无法作为左值被赋值,只能用于赋值或比较故产生了该错误。

解决方法

该设计思路为先计算p+i作为地址再进行取值操作,故此处可以使用括号修改代码,修改结果如下:

此时赋值符 = 左边均为左值即可被赋值的变量或存储空间。故使用赋值符 = 时应对其左边的内容稍加关注,避免此类由于优先级导致的语法错误。

扩展资料

值得注意的是,赋值符正确使用时会附带隐含的类型转换,如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:

1、实型赋予整型,舍去小数部分。此处应注意C语言的舍去一般采用截断舍去,对整数部分不影响。

2、整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分,一般小数部分的值为0,但由于浮点数精度问题可能产生误差。

3、字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。此处实际赋值时与选择的编译器有关,具体编译器需要具体分析。

参考技术A

出现该错误提示是因为语法错误。

“left operand must be l-value”的意思是左操作数必须是左值。

左值(l-value):出现于“=”左边的标识符。(为变量)。

右值(r-value):出现于“=”右边的标识符。(变量或表达式)。

表达式:产生确定不变的值。类似于a1x^n + a2x^n-1 +...+ an多项式(n>=1)。

*p+i 是一个表达式,是右值,不能对其进行赋值。应改用*(p+i)来表示数组中的第i+1个变量,同样的,还有*(p+j)。

扩展资料:

C语言程序结构——

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。

判断语句(选择结构):

if 语句:“如果”语句;if—else 语句:“若…(则)…否则…”语句;switch 语句:“切换”语句;switch—case:“切换—情况”语句。

循环语句(循环结构):

while 语句:“当…”语句;do—while 语句:“做…当…(时候)”语句;for 语句:条件语句(即“(做)…为了…”语句)。

跳转语句(循环结构:是否循环):

goto 语句:“转舵”语句,也称“跳转”语句;break 语句:“中断”(循环)语句,即结束整个循环;continue 语句:“继续”语句(结束本次循环,继续下一次循环);return 语句:“返回”语句。

参考技术B

这句话“left operand must be l-value”左操作数必须是左值左值(l-value)。

出现于“=”左边的标识符。为变量右值出现于“=”右边的标识符。变量或表达式表达式是产生确定不变的值。

类似于a1x^n + a2x^n-1 +...+ an多项式(n>=1) 问题原因:*p+i 是一个表达式,是右值,不能对其进行赋值。改正:这里你应该用*(p+i)来表示数组中的第i+1个变量;同样的,还有*(p+j)。

左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以做为一个左值。右值指的是引用了一个存储在某个内存地址里的数据。

左值其实要引用一个对象,而一个对象在程序中又肯定有一个名字或者可以通过一个名字访问到,所以左值又可以归纳为左值表示程序中必须有一个特定的名字引用到这个值。

而右值引用的是地址里的内容,所以相反右值又可以归纳为右值表示程序中没有一个特定的名字引用到这个值除了用地址。

扩展资料

右值用于函数参数的源代码如下

// 接收左值

void fun(int& lref)

cout << "l-value reference\\n";

// 接收右值

void fun(int&& rref)

cout << "r-value reference\\n";

int main()

int x = 10;

fun(x); // output: l-value reference

fun(10); // output: r-value reference



参考技术C 这句话“left operand must be l-value”说的多好!左操作数必须是左值!
左值(l-value):出现于“=”左边的标识符。(为变量)
右值(r-value):出现于“=”右边的标识符。(变量或表达式)
表达式:产生确定不变的值。类似于a1x^n + a2x^n-1 +...+ an多项式(n>=1)

问题原因:
*p+i 是一个表达式,是右值,不能对其进行赋值。
改正:
这里你应该用*(p+i)来表示数组中的第i+1个变量;同样的,还有*(p+j);追问

嗯 就是这样,讲得很详细啊

本回答被提问者和网友采纳
参考技术D 错误提示很明确,左操作数必须是个左值。iMul-IMUL得到的是一个临时变量是一个右值,你不能对一个右值进行复制。
PS:看是不是左值我的观点是看他能不能直接取到地址,iMul-IMUL显然你取不到。

以上是关于c语言int k=10; for(;!k;k--)printf("%d",k--)为啥无答案的主要内容,如果未能解决你的问题,请参考以下文章

C语言删除数组重复数字

C语言 计算∑(k=1—100)k+∑(k=1—50)k²+∑(k=1—10)1/k的值

C语言使用指针实现选择法排序。

用c语言输出1000以内的水仙花数

C语言之直接插入排序

C语言编写一个num函数,找出1到N被7或者11整除的所有整数放在数组a中,通过K反馈个数。