c语言j
❶ c语言中j=j<<i;怎么理解啊也就是<<这个符号怎么理解
“<<”代表左移运算符(就相当于'shl')。该运算符为双目运算符,结合方向为从左到右,作用是把一个整型数的所有位向左移动指定的位数,移动到左边界之外的多余二进制位会被丢弃,并从右边界移入0。
左移运算的两个操作数应为整数类型。第一个操作数是要进行移位操作的数,第二个操作数指定第一个操作数移动的位数。如果第二个操作数等于0则不发生任何移位。
应用举例:
一,问:计算表达式14 << 2的值。
答:表达式14 << 2的值为56,因为14(即二进制的00001110)向左移两位等于56(即二进制的00111000)。
二,问: 计算表达式8 >> 2的值。
答:表达式8 >> 2的值为2,因为8(即二进制的00001000)向右移两位等于2(即二进制的00000010)。
摘自:网络
❷ c语言中J+=2是什么意思
J+=2也就是相当于这样的J=J+2。。就是先让J的值加上2,再把它赋给J,如果原先J是2的话,那么执行完J+=2之后,J的值就是4了 还有类似的a- =3,同样,就是相当于a=a-3
❸ C语言中*=j什么意思
a[j]=!a[j]在c语言中意思是给a[j]赋与其相反的真假值。例如,如果a[j]=1,那!a[j]=0,赋值后,a[j]=0,如果,a[j]=0,那!a[j]=1,赋值语句后,a[j]=1。
“!”(逻辑非)逻辑运算符。是指本来值的反值。" !0" 这个逻辑表达式的值为1。(判断的这个数为0,成立,则其表达式的值为1)。" !1" 这个逻辑表达式的值为0。(判断的这个数非0,不成立,则其表达式的值为0)。
(3)c语言j扩展阅读:
逻辑运算用来判断一件事情是“对”的还是“错”的,或者说是“成立”还是“不成立”,判断的结果是二值的,即没有“可能是”或者“可能不是”,这个“可能”的用法是一个模糊概念。
在计算机里面进行的是二进制运算,逻辑判断的结果只有二个值,称这二个值为“逻辑值”,用数的符号表示就是“1”和“0”。其中“1”表示该逻辑运算的结果是“成立”的,如果一个逻辑运算式的结果为“0”,那么这个逻辑运算式表达的内容“不成立“。
❹ C语言问题: j=*i j=&i j=*&i 三者有何区别
j=*i;//说明j是普通变量,i是指针变量,意思是把i指向的变量中的值赋值给j
j=&i//说明j是指针变量,i是普通变量,取i的地址然后赋值给j,这样j就指向i了
j=*&i//你得先确定*和&的优先级和结合性,*&i等价于*(&i),也就是先取i的地址,然后求这个地址所指向的内容,其实就是i,所以这里,j和i都是普通变量,此等式的含义就是把i的值赋值给j
❺ c语言表达式(j=3,j++)是什么意思
j++是j自增,不参与表达式的计算。
而++j则是将j先自增后再参与表达式计算。
如表达式(++j)+j
如开开始j=3,那么先自增1,j=4,并且后面的j也按4算
表达式的值为8
给你看个详细的别人的解释:
1.对++j的处理分两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。
2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。
第一种情况:
就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:
m+=(j++)+(++j)+(j++);
有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,最后的运算就是:
m += 3 + 3 + 3;
而不是
m += 2 + 3 + 4, 虽然结果都是m += 9
你试着把他们的顺序换一下:
m+=(j++)+(j++)+(++j);
++j换到了后面,结果仍然是3+3+3,而不是2+2+3,
再如:
m+=(j++)+(++j)+(j++)+(++j);
++j出现了2次,那么先将j自增两次,为4,表达等价于:
m+= 4 + 4 + 4 + 4;
而不是
m+=2+3+2+3;
看下这个表达式的汇编:
1 inc si ;自增j
2 inc si
3 mov ax,si ;加法运算
4 add ax,si
5 add ax,si
6 add ax,si
7 add di,ax
8 inc si ;自增j
9 inc si
第1行和第2行是将++j自增,3到7行是加法运算。8、9行是j++的自增,不参与表达式的运算。
所以使用这种编译方式的编译器,++j的位置对结果无影响。
第二种情况:
VC、dev c,好像gcc也是这种情况,他是在运算过程中对++j进行运算。所以++j的位置对结果有影响。
其中VC的还比较奇特,比如
m=(j++)+(++j)+(++j)+(j++)+(j++);
的汇编:
mov eax, DWORD PTR _j$[ebp]
add eax, 1
mov DWORD PTR _j$[ebp], eax ++j;
mov ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov edx, DWORD PTR _j$[ebp]
add edx, 1
mov DWORD PTR _j$[ebp], edx ++j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov DWORD PTR _m$[ebp], ecx
结果是
m = 3 + 3 + 4 + 4 + 4 = 18
但是将其中一个++j调换顺序:
m=(j++)+(++j)+(j++)+(++j)+(j++);
结果是:
m = 3 + 3 + 3 + 4 + 4 = 17
但是
m = (j++)+(j++)+(++j)+(++j)+(j++)+(j++);
结果却是
m = 2 + 2 + 3 + 4 + 4 + 4 = 19
就是说前面两个在第二个++j之前都提前进行了++j,而第三个表达式没有。
总之比较奇特,跟VC编译器代码优化什么的有关系。而且你将VC6的编译改成release,上面第三个表达式的结果就是
m = 4 + 4 + 4 + 4 + 4 + 4 = 24,不是19了!
❻ C语言中k*=j是什么意思
你说的是这个么:
k= --j;等价于j=j-1,之后再把j的值赋给k;
列:main()
{int j=6,k;
printf("%d\n",k=--j);
}
输出5
(其实这里考到了自加与赋值运算以及他们的优先级
优先级:自加运算符>赋值运算符。
❼ c语言程序;j--和--j有什么区别
单独使用没有区别,但如果在表达式中出现有区别。
j-- 出现在表达式中时,j 会以当前值参与表达式运算中,最后才自减1.
--j 出现在表达式中时,j 会先自减1,然后以减1后的值参与到表达式运算中。
++ 也如此。
例如:
j = 3;
i = --j; // i 的值为 2, j 为2
// i = j--; // i 为3, j 为2
❽ C语言中的--j,是什么意思
j减去1,与j--不同在于,前者当前运算时已经减一,而后者是当前运算没有减
j = 2
a = --j;// a = 1
b = j--;// b = 1,前面j已经为1,当前的j--事后生效
❾ 在C语言中j---j等于多少
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
%f:输入输出为浮点型
虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),