我经常发现自己写的东西
int computedValue = ...;
return MAX(0, MIN(5, computedValue));
Run Code Online (Sandbox Code Playgroud)
我希望能够将其写为单个单行宏.它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型.
任何人都可以告诉我如何把它变成一个宏吗?
该min函数的经典预处理器版本看起来像
#define min(a, b) ((a) < (b) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)
这使你可以进行双重评估 - 你做的情况min(f(), g()),忘记f或g有副作用,你必须花费数小时试图找出你的功能运行两次的原因.为了防止这种情况,你可以做到
#define min(a, b) ({__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a < _b ? _a : _b;})
Run Code Online (Sandbox Code Playgroud)
这在GCC下运行得很好,但是如果你通过-Wgnu套装运行它- 这套警告属于-pedantic你的保护范围内- 你得到的错误就像
test.c:5:10: error: use of GNU statement expression extension [-Werror,-Wgnu]
int a = min(3, 7);
^
test.c:1:22: note: expanded from macro 'min'
# define min(a, b) ({__typeof__(a) _a = (a); __typeof__(b) …Run Code Online (Sandbox Code Playgroud) 我担心以下情况
min(-0.0,0.0)
max(-0.0,0.0)
minmag(-x,x)
maxmag(-x,x)
Run Code Online (Sandbox Code Playgroud)
据维基百科IEEE 754-2008称,关于min和max
定义了最小和最大操作,但是对于输入值相等但表示不同的情况留有一些余地.特别是:
min(+ 0,-0)或min(-0,+ 0)必须产生值为零的东西,但可能总是返回第一个参数.
我做了一些测试比较fmin,fmax,最小值和最大值定义见下文
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
#define min(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
并_mm_min_ps和_mm_max_ps其称之为SSE minps和maxps指令.
以下是结果(我用来测试的代码发布在下面)
fmin(-0.0,0.0) = …Run Code Online (Sandbox Code Playgroud) 我想用#define创建一个简单的宏来返回两个数字中较小的一个.
我怎么能用C做这个?提出一些想法,看看你是否可以使它更加混淆.
我遇到了一个面试问题,内容如下:
"编写一个简单的C/C++宏来查找最多两个数字而不使用std库或三元运算符".
我需要你帮助解决这个问题.我知道这是微不足道的,但我找不到它.所以,在这里发布.
#include<iostream>
#define max(x,y) /*LOGIC HERE*/
using namespace std;
void main()
{
int a = 98453;
int b = 66394;
cout<<max(a,b);
}
Run Code Online (Sandbox Code Playgroud) 该文件windef.h使用宏定义最小/最大函数,如下所示:
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
Run Code Online (Sandbox Code Playgroud)
但是,已经注意到这样一个定义:
我不明白的是:
__typeof__ (a) _a = (a); __typeof__ (b) _b = (b);有助于类型安全,为什么在这种情况下不进行双重评估?我有一个数组,我需要在组中对该数组中的数字进行排序.例如,如果我有9个数字而我的P是3,我需要按降序排序三个数字然后另外3个和另外3个.
例:
123 124 125 222 223 224 333 334 335
M是组数,P是组中的数量.如果M是3而P也是3则需要给出答案
125 124 123 224 223 222 335 334 333
这是我提出的,但它不起作用.
void sortgroup(int M, int P, int A[i])
{
int c, d, swap, z = 0;
for (c = z ; c < ( P*M - 1 + z ); c++)
{
for (d = z ; d < P + z - 1; d++)
{
if (A[d] < A[d+1])
{
swap = A[d];
A[d] = A[d+1];
A[d+1] = …Run Code Online (Sandbox Code Playgroud) 我有以下一组代码无法找到我获得垃圾值的原因.我的意图是将字节数复制为目标而不管源是否为我的应用程序制作通用副本.但没有得到正确的结果.有没有办法实现这一目标.
int main()
{
char x[6];
char *i="pra";
memset(&x,0,6); //Doing memset
memcpy(&x,i,6);
printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]);
}
o/p:
70 72 61 0 25 78
Run Code Online (Sandbox Code Playgroud)
我们可以看到0之后的输出是垃圾.但是为什么它正在进行以及它的来源.乳清memset不能正常工作.Pleae有助于了解这一概念的原因.
我正在深入学习C。但我没有得到这个程序。有人请告诉我下面程序的输出是如何m=2, n=3
#include <stdio.h>
#define MAX(a,b) a>b ? a:b
int main()
{
int m,n;
m=3+MAX(2,3);
n=2*MAX(3,2);
printf("m=%d, n=%d\n",m,n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)