相关疑难解决方法(0)

如何写一个'clamp'/'clip'/'bound'宏来返回给定范围内的值?

我经常发现自己写的东西

int computedValue = ...;
return MAX(0, MIN(5, computedValue));
Run Code Online (Sandbox Code Playgroud)

我希望能够将其写为单个单行宏.它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型.

任何人都可以告诉我如何把它变成一个宏吗?

c macros objective-c predefined-macro

9
推荐指数
1
解决办法
7373
查看次数

在没有双重评估的情况下在Clang中实现min()和max()

min函数的经典预处理器版本看起来像

#define min(a, b) ((a) < (b) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

这使你可以进行双重评估 - 你做的情况min(f(), g()),忘记fg有副作用,你必须花费数小时试图找出你的功能运行两次的原因.为了防止这种情况,你可以做到

#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)

c clang

9
推荐指数
2
解决办法
3498
查看次数

有符号零的最小值和最大值

我担心以下情况

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 minpsmaxps指令.

以下是结果(我用来测试的代码发布在下面)

fmin(-0.0,0.0)       = …
Run Code Online (Sandbox Code Playgroud)

c c++ floating-point sse ieee-754

8
推荐指数
1
解决办法
749
查看次数

C宏至少有两个数字

我想用#define创建一个简单的宏来返回两个数字中较小的一个.

我怎么能用C做这个?提出一些想法,看看你是否可以使它更加混淆.

c minimum c-preprocessor

5
推荐指数
3
解决办法
3万
查看次数

C/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)

c c++ c-preprocessor

5
推荐指数
2
解决办法
3928
查看次数

查找两个数字中较大的一个的库函数

是否有任何库函数c可以找出两个数字之间的最大数字?

c

2
推荐指数
1
解决办法
2万
查看次数

min/max函数的无辜宏定义有什么问题?

该文件windef.h使用宏定义最小/最大函数,如下所示:

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
Run Code Online (Sandbox Code Playgroud)

但是,已经注意到这样一个定义:

  1. 遭受双重评估.
  2. 不安全.

我不明白的是:

  1. 为什么/哪里有双重评估?
  2. 琐碎的重新定义如何__typeof__ (a) _a = (a); __typeof__ (b) _b = (b);有助于类型安全,为什么在这种情况下不进行双重评估?

c macros

2
推荐指数
1
解决办法
145
查看次数

C - 如何在组中对一维数组中的数字进行排序?

我有一个数组,我需要在组中对该数组中的数字进行排序.例如,如果我有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)

c arrays sorting

0
推荐指数
1
解决办法
161
查看次数

memset无法正常工作

我有以下一组代码无法找到我获得垃圾值的原因.我的意图是将字节数复制为目标而不管源是否为我的应用程序制作通用副本.但没有得到正确的结果.有没有办法实现这一目标.

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 linux libc memcpy

-1
推荐指数
1
解决办法
225
查看次数

C 编程 - #define 函数

我正在深入学习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)

c

-2
推荐指数
1
解决办法
3205
查看次数