我在使用C中的一些高级概念时相当新。我正在尝试理解使用<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
...
</Grid.ColumnDefinitions>
<Border Grid.Row="2" Grid.Column="1" BorderBrush="Black" BorderThickness="2">
//Content here
</Border>
</Grid>
,_
和>>
的API中的代码。我理解<<
用作保留标识符,_
用于按位右,>>
用于按位左移。
但我想知道的是我们如何知道<<
接受的数据类型参数是什么?以及函数如何以及为何进行偏移和舍入的按位运算?最后,为什么我得到错误无效的操作数?
请找到以下代码:
OFFSET_AND_ROUND2
请在下面找到错误消息:
#include <stdio.h>
#define OFFSET_AND_ROUND2(_a, _b) (((_a)+(1<<((_b)-1))-((_a)<0?1:0))>>(_b))
int main()
{
printf("Hello World\n\n");
printf("%d", OFFSET_AND_ROUND2(3.87,2));
return 0;
}
我期待更多地了解C,谢谢!
答案 0 :(得分:3)
但我想知道的是我们如何知道 OFFSET_AND_ROUND2 接受的数据类型参数是什么?
这是宏的问题之一。如果没有文件 明确告诉您输入和输出数据类型,然后拥有 看看如何声明宏。根据您对C的了解和 宏的复杂性,这很难猜到。这是最重要的原因之一 有经验的用户告诉最不经验的用户&#34;不要使用宏#34;。
在这种情况下,宏正在进行位操作和加法和减法。
结果类型取决于输入的类型。如果是int
输入,结果将是int
。
关于错误:
main.c:10:69: error: invalid operands to binary >> (have 'double' and 'int')
此处gcc告诉您,您已通过double
二进制右移>>
- 运算符。
您只能使用整数类型(char
,int
执行右移和左移,
long
等)。任何一个都不允许浮点(float
,double
)
运营商的一面。
所以正确的电话会是
printf("%d", OFFSET_AND_ROUND2(3,2));
如果你不知道什么是移位,左移会将位模式移动到
离开,填补&#34;新&#34;比特为0.右移同样但来自
对。假设您有一个值为0x13
的字节(十进制为19)
操作char x = 0x13; char y = x << 2
将改变位
变量太向左,结果将存储在y
。
msb = most significant bit
lsb = least significant bit
msb lsb
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | == 19 (decimal)
+---+---+---+---+---+---+---+---+
x << 2
msb lsb
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | == 76 (decimal)
+---+---+---+---+---+---+---+---+
答案 1 :(得分:2)
使用宏时,preprocesser获取宏的内容并替换每个出现的内容。 举个例子:
#define A 5
...
int a = A;
被翻译为
int a = 5;
参数相同:
#define A(_a) (_a+1)
...
int a = A(2);
被翻译为
int a = (2+1);
最终,只要支持所有需要的操作,使用哪种数据类型并不重要。 错误是因为你不能在c ++中移动浮点数/双打
因为它的作用类似于搜索&amp;如有必要,使用括号替换它非常重要:
#define ADD(_a,_b) _a+_b
...
int a = ADD(5,4) * 3;
被翻译为
int a = 5+4 * 3 // = 5 + (4 * 3) = 17
而(5 + 4)* 3 = 27