小编Nos*_*iii的帖子

在 main() 中声明的函数是否具有外部链接或无链接?

请参阅以下代码:

/* first file */

int i; /* definition */
int main () {
  void f_in_other_place (void);   /* declaration */
  i = 0
  return 0;
}
/* end of first file */


/* start of second file */

extern int i; /* declaration */
void f_in_other_place (void){   /* definition */
  i++;
}
/* end of second file */
Run Code Online (Sandbox Code Playgroud)

我知道外部对象有external链接,内部对象有none链接(extern暂时忽略)。现在,如果我谈论函数f_in_other_place(),它是在 main 函数中声明的。那么它的标识符会被视为内部对象吗?如果是,则它应该具有none链接,但在程序中可见,此函数指的是它在第二个文件中的定义,该文件显示它的标识符的行为类似于具有external链接的对象。所以我很困惑这里的这个标识符是否有external链接或none链接?

现在谈到extern关键字,我在某处读到了函数声明隐式前缀 …

c external function extern linkage

12
推荐指数
1
解决办法
407
查看次数

C中的短路和运算符优先级

我知道 C 中的逻辑运算符遵循短路,但我怀疑短路和运算符优先级规则并不相互对立。请参阅以下示例:

#include<stdio.h>
int main()
{
    int a;
    int b=5;

    a=0 && --b;
    printf("%d %d",a,b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据优先级规则,最高优先级是前缀运算符。所以--b应该首先评估,然后&&最后的结果将被分配给a. 所以预期的输出应该是0 4. 但在这种情况下,第二个操作数&&never 实际执行并且结果是0 5.

为什么这里没有应用优先规则。逻辑运算符是否不受优先规则的约束?如果是,还有哪些其他运营商表现出这种行为?这种行为背后的逻辑是什么?

c operators operator-precedence short-circuiting logical-operators

7
推荐指数
2
解决办法
502
查看次数

C 中的默认参数和参数提升

我正在研究默认参数提升,并一度陷入困境。在 C 2011 (ISO/IEC 9899:2011) 中,相关部分似乎是:

§6.5.2.2 函数调用

¶6 如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并且具有 float 类型的参数提升为 double。这些被称为默认参数提升。如果参数数量不等于参数数量,则行为未定义。如果函数定义为包含原型的类型,并且原型以省略号 (, ...) 结尾,或者提升后的参数类型与参数类型不兼容,则行为未定义。如果函数定义的类型不包含原型,并且提升后的参数类型与提升后的参数类型不兼容,则行为未定义,

——一个提升类型是有符号整数类型,另一个提升类型是对应的无符号整数类型,值在两种类型中都可以表示;

— 两种类型都是指向字符类型或 void 的限定或非限定版本的指针。

在段落的最后三行中,它讨论了定义时不包含原型的函数类型。

它表示如果提升后的参数类型与提升后的参数类型不兼容,则行为是 undefined

现在我有一个非常愚蠢的疑问,如果函数声明和函数定义都没有包含本段中提到的原型,那么他们在段落的最后三行中谈论的是哪些参数。这里“提升后的参数”是什么意思,因为我只研究了参数提升。什么是“参数提升”?

您还可以举例说明最后提到的例外情况。如果有人可以用一个适当的例子来解释这一点,那将是非常可观的。

c standards promotions function-call undefined-behavior

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

我们可以在 C 中将 (void *)0 称为 void 指针吗?

总结 C 标准,特别是ISO/IEC 9899:201x \xc2\xa76.3.2.3 - 3

\n

如果将指针与常量文字进行比较0,则检查该指针是否为空指针。这0被称为空指针常量。C 标准定义0转换为类型void *既是空指针又是空指针常量。

\n

现在,如果我们看一下(void *)0它是一个指向 的地址(在这种情况下是非法的)void

\n

通常我们可以将这样的地址转换为任何适当的指针数据类型并取消引用它,但在这里即使在将其转换为其他指针类型之后,取消引用它也是非法的。

\n

所以我的疑问是:

\n

我们可以(void *)0按照其定义的方式调用 void 指针吗?

\n

另请参阅下面的代码:

\n
void *pointer = NULL;\n
Run Code Online (Sandbox Code Playgroud)\n

现在我该怎么称呼它呢?void 指针、空指针还是 null void 指针?

\n

c null pointers void-pointers null-pointer

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

SQL查询中\%和\\是什么意思?

我知道的含义%_通配符,但我被困在其中使用另外两个字符的问题\%\\,我无法了解这些文字的实际含义SQL查询

SELECT productID 
FROM productList 
WHERE productName LIKE 'ab\%cd%'
Run Code Online (Sandbox Code Playgroud)

SELECT productID 
FROM productList 
WHERE productName LIKE 'ab\\cd%'
Run Code Online (Sandbox Code Playgroud)

这两个相同或不同的东西?

mysql wildcard sql-like

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

x和y的atan2输出为0

theta=atan2(0,0);
Run Code Online (Sandbox Code Playgroud)

这个语句的输出是0,但它是一个0/0形式,所以它的输出如何为0,甚至维基百科说它应该是未定义的,请解释为什么编译器给出0作为该语句的输出.

c trigonometry angle undefined atan2

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

作为sizeof()运算符的操作数的地址

我只是尝试一个例子,当一个地址作为sizeof 运算符中的参数传递时我试图检查输出,我输出为4.现在我的问题是当你在sizeof运算符中传递指针时为什么它显示4个字节的内存实际上没有指针变量时,它只是一个地址?

#include<stdio.h>
int main()
{
  int a=1;
  int c;
  c=sizeof(&a);
  printf("%d\n",c);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c sizeof

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