小编124*_*123的帖子

后递增总是在函数调用之前完成吗?

考虑这段代码:

#include <stdio.h>
static int g=3;

static int foo(int a)
{ 
  return g+a; 
}

int main(void)
{
  printf("%i\n",foo(g++));
}
Run Code Online (Sandbox Code Playgroud)

输出总是7(假设printf()不会失败)?意思是,标准是否保证g++参数列表中的表达式在输入foo()之前执行?foo()或者编译器是否有可能在执行完成后设置g=3调用foo()g==3递增(并输出而不是输出)?gfoo()67

我测试打印的所有编译器(版本)都7没有显示任何警告。但这并不意味着事情必须如此。

c language-lawyer

18
推荐指数
1
解决办法
1182
查看次数

其中sizeof(size_t)<sizeof(unsigned int)的实际实现

我知道C标准允许在哪里实现

(sizeof(unsigned) > sizeof(size_t))
Run Code Online (Sandbox Code Playgroud)

要么

(sizeof(int) > sizeof(ptrdiff_t))
Run Code Online (Sandbox Code Playgroud)

是真的.但是有没有真正的实现,其中一个是真的?

背景

我编写了一个类似于asprintf()(因为asprintf()不可移植)的函数,并snprintf()返回一个int但需要一个size_t参数,所以我应该检查leni(如下所示)是否不小SIZE_MAX于此代码?

va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
  //do some error handling
if(leni>=SIZE_MAX) //do i need this part?
  //error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
  //do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
Run Code Online (Sandbox Code Playgroud)

c sizeof size-t

6
推荐指数
1
解决办法
122
查看次数

结构可以小于其组件的总和吗?

我知道编译器可能会在结构中添加一些填充字节.但是,当编译器发现我们从未从结构中的变量中读取时,结构的大小会比成员的总大小小吗?

struct Foo_T
{
  int a;
  intmax_t b;
};


void bar(void)
{
  struct Foo_T foo;
  foo.a=rand();
  someFunction(foo.a);
  //i never access foo.b, only foo.a
  if(sizeof(foo)< sizeof(int)+sizeof(intmax_t))
    {
      //is it possible that we can end here?
    }
}
Run Code Online (Sandbox Code Playgroud)

c struct sizeof

6
推荐指数
1
解决办法
206
查看次数

为什么1e400不是int?

为什么科学记数法中的数字总是被读作a float,如何将像'1e400'这样的字符串转换为a int(对于a来说太大了float)?

>>>int('1e400') 
ValueError: invalid literal for int() with base 10: '1e400'
>>>int(float('1e400'))
OverflowError: cannot convert float infinity to integer
Run Code Online (Sandbox Code Playgroud)

我知道,我可以做一个像这样的功能:

def strtoint(string):
  parts = string.split('e')
  if len(parts) == 1:
    return int(string)
  elif len(parts) == 2:
    if int(parts[1])<0:
      return int(string)
    return int(parts[0])*10**int(parts[1])
  else:
    return int(string) #raise a error if the string is invalid, but if the variable string is not a string, it may have other way to convert to an `int`
Run Code Online (Sandbox Code Playgroud)

但这不是一种非常pythonic的方式,有更好的方法吗?

python floating-point int scientific-notation

5
推荐指数
1
解决办法
702
查看次数

当输出足够小时,给 snprintf() 太大的大小

这段代码会导致未定义的行为吗?因为缓冲区只有 128 字节长,但我告诉snprintf()它更长。但是,生成的字符串短于 128 字节。

#include <stdio.h>

int main(void)
{
  char buffer[128];
  snprintf(buffer,294201,"%s","ABC");
  puts(buffer);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c printf undefined-behavior

5
推荐指数
1
解决办法
734
查看次数

can(u)intmax_t是否包含函数指针?

是一个uintmax_t保证大是否需要持有一个函数指针?

我知道这个:

以下类型指定无符号整数类型,能够表示任何无符号整数类型的任何值:

uintmax_t
Run Code Online (Sandbox Code Playgroud)

下面的类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将比较原始指针:uintptr_t

并且一个void-Pointer可能不大,只能保存一个函数指针,因此uintptr_t也可能不足以容纳一个函数指针.

c

4
推荐指数
1
解决办法
213
查看次数

IEEE754 中 inf==inf 的基本原理是什么

当您有符合 IEEE754 标准的浮点实现时,与NaNis false、 Even NaN == NaN、 but +inf == +infis进行任何比较true,为什么?

从我的角度来看,说是假的更有意义 +inf == +inf,原因是:

  • 自然数和实数的个数都是无限的,但并不相同。

  • 如果有X=1e200and Y=1e300(X 和 Y 都是 64 位双精度数),那么x==y也是false, butx*1e200==y*1e200是 true true(都是 +inf),这是数学上不正确的。

  • 已经需要进行特殊处理, for NaN, where X==Xis ,因此实现该returnfalse不会有更多的实现复杂性。也许甚至更少,因为和我们同一个“指数”。+inf == +inffalseinfNaN

  • 我没有看到任何优势,也没有看到任何需要这样的应用程序+inf == +inf。无论如何,您不应该比较任何浮点值==

  • X==Y那么一般的话true,如果X-Y==0true,但是inf-infNaN …

floating-point ieee-754

4
推荐指数
1
解决办法
743
查看次数

C IEEE-Floats inf等于inf

在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或"false".但是为什么两个浮点数都被认为是相等的呢?

这个程序打印"相等:......"(至少在Linux AMD64下使用gcc),在我看来它应该打印"不同:......".

#include <stdio.h>
#include <stdlib.h>

int main(void)
  {
    volatile double a = 1e200; //use volatile to suppress compiler warnings
    volatile double b = 3e200;
    volatile double c = 1e200;
    double resA = a * c;  //resA and resB should by inf
    double resB = b * c;
    if (resA == resB)
      {   
        printf("equal: %e * %e = %e = %e = %e * %e\n",a,c,resA,resB,b,c);
      }   
    else
      {   
        printf("different: %e * %e = %e != %e = %e * …
Run Code Online (Sandbox Code Playgroud)

c floating-point ieee-754

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

有没有办法检查c中两个函数是否具有相同的类型?

例如我有这 3 个函数和函数指针:

char *(*f)(char, int);
char *(*g(char, int));
char **h(char, int);
Run Code Online (Sandbox Code Playgroud)

如果我们将它们翻译成英文,我们会得到:

  1. 将 f 声明为指向函数 (char, int) 的指针,返回指向 char 的指针

  2. 将 g 声明为函数 (char, int) 返回指向 char 的指针

  3. 将 h 声明为函数 (char, int) 返回指向 char 的指针

类型 2. 和类型 3. 是相等的。我们可以检查一下吗,也许是这样的:

if(g==h)
{
    do something;
}
Run Code Online (Sandbox Code Playgroud)

在c中?

c 也允许类似的东西吗g=h?(如果是,它实际上是做什么的?)

c function

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