amp在c语言中需要提前定义吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了amp在c语言中需要提前定义吗相关的知识,希望对你有一定的参考价值。

需要提前定义,(1)变量名的命名规则;分析:变量名的命名规则遵循用户自定义标识符命名规则(1)只能由字母、数字、下划线组成;(2)第一个字符必须是英文字母;(3)有效长度为255个字符;(4)不可以包含标点符号和类型说明符%、&、。
必须以字母开头,变量名中不能有空格。
不可以包含嵌入的句号或者类型声明字符。
不能和受到限制的关键字同名(例如End、Len、Sub等)。
不能超过255个字符,控件、窗体、类和模块的名字不能超过40个字符。 注意:sual 和Basic 不区分。
参考技术A amp在c语言中需要提前定义吗,对于c语言中的&运算符,定义:(&p)则是这样一种运算,返回当时声明p 时开辟的地址;但是根据我对代码的观察,我觉得&运算符不只是返回地址的功能;

例如:int a = 1;

//假设a的地址是0x7dfe88

int *p = (int *)0x7dfe88;

int num = 1;

int *p1 = #

以上是一段简单的给指针p,p1赋值的代码,0x7dfe88是一段单纯的十六进制地址,但是当地址转指针的时候却必须加上强转(int *);如果不加强转,那么编译器就会提出警告( warning C4047: “初始化”:“int *”与“int”的间接级别不同);但是使用&运算符取地址的时候却不需要加任何强转就能编译通过,说明&运算符绝不是的获取地址那么简单,“=”赋值运算符的运算顺勋是从右向左,说明"="的右边也是一个指针,所以在此假设&运算符会取出num的地址,并且根据num的类型生成一个临时的指针。
参考技术B amp在c语言中需要提前定义。以引用返回函数值,定义函数时需要在函数名前加&。 参考技术C amp在c语言中需要提前定义吗最佳回答:amp在c语言中需要提前定义的。 参考技术D 对于c语言中的&运算符,定义:(&p)则是这样一种运算,返回当时声明p 时开辟的地址;但是根据我对代码的观察,我觉得&运算符不只是返回地址的功能; 例如:int a = 1; //假设a的地址是0x7dfe88 int *p = (int *)0x7dfe88; int num = 1; int *p1 = # 以上是一段简单的给指针p,p1赋值的代码,0x7dfe88是一段单纯的十六进制地址,但是当地址转指针的时候却必须加上强转(int *);如果不加强转,那么编译器就会提出警告( warning C4047: “初始化”:“int *”与“int”的间接级别不同);但是使用&运算符取地址的时候却不需要加任何强转就能编译通过,

负数在 C/C++ 中返回 false 吗?

【中文标题】负数在 C/C++ 中返回 false 吗?【英文标题】:Do negative numbers return false in C/C++? 【发布时间】:2013-09-21 08:02:40 【问题描述】:

在 C/C++ 中将整数计算为布尔值时,负数是真还是假?无论编译器如何,它们总是真/假吗?

【问题讨论】:

任何不为零的都是真的。 正如您从下面引用不同标准的答案中看到的那样,C 和 C++ 不是同一种语言。 你自己试试看吧? if(-1) cout << "true" << endl; @JackCColeman:这到底是怎么让鸭子错的?他说任何不为零的东西都是真的; -1 不为零,因此 -1 为真。出于某种原因,这似乎让您感到惊讶,但这正是鸭子所说的,也是布伦丹的程序所说的。 ...我记得 BASIC 解释器将“true”存储为 -1。我想这就是这样的问题的来源。 【参考方案1】:

所有非零值都将转换为true,零值将转换为false。负数不为零,它们将转换为true

引用 C++11 标准(强调我的):

4.12 布尔转换 [conv.bool]

1 算术、无范围枚举、指针或指针的纯右值 to 成员类型可以转换为 bool 类型的纯右值。 零 值、空指针值或空成员指针值被转换 给false;任何其他值都将转换为 true 类型的纯右值 std::nullptr_t 可以转换为 bool 类型的纯右值;这 结果值为假。


无论编译器如何,它们总是真/假吗?

只有当您的编译器符合标准或至少符合标准的这一特定部分时,您才能获得上述保证。实际上,所有编译器都具有这种标准行为,因此无需担心太多。

【讨论】:

请注意,这个问题(也许不完全恰当)询问了 C 和 C++。两者的结果相同,但规则的表述不同。有关血腥细节,请参阅my answer。【参考方案2】:

你可以自己编译测试一下:

#include <stdio.h>

int main(int argc, char** argv) 
    if (-1) 
        printf("-1 is true\n");
     else 
        printf("-1 is false\n");
    
    return 0;

结果:

$ gcc -Wall -pedantic test.c -o test-c $ g++ -Wall -pedantic test.c -o test-cpp $ ./test-c -1 为真 $ ./test-cpp -1 为真

当然,要回答您问题的第二部分,“无论编译器如何,它们总是对/错吗?”,完全确定的唯一方法是查看规范。但总的来说,如果你做了危险的事情,编译器会警告你,你可以从上面的输出中看到,即使是“迂腐”warnings,gcc 也认为这段代码非常好。

【讨论】:

吹毛求疵,但在一个甚至多个编译器上运行的示例并不能证明这可以工作或应该在所有编译器上工作,即它不依赖于实现。 @ShafikYaghmour 是的。我更新了答案以提供更多详细信息,并添加了-Wall -pedantic,以表明 gcc 没有发现任何问题。我在规范答案之后创建了这个答案,主要是为了表明问题的第一部分很容易测试。【参考方案3】:

简短回答:负值以及任何一般的非零值在用作条件时都被视为真。

对于 C,有许多上下文将表达式视为条件。条件不一定是bool_Bool 类型;该类型仅由 1999 年标准添加到语言中。

这些上下文中最明显的是if 语句中的表达式,但还有其他示例:whiledo-whilefor 标头中的第二个表达式、@987654327 的第一个操作数@ 条件运算符,以及 !&amp;&amp;|| 运算符的操作数。 (我认为这是一个详尽的列表,但我不确定。)

以下是 C 标准对 if 语句行为的说明(“两种形式”指的是 if 有和没有 else 子句):

在这两种形式中,如果表达式比较不等于 0,则执行第一个子语句。

这意味着:

if (foo) ...

等价于:

if ((foo) != 0) ...

(添加额外的括号以避免任何运算符优先级问题)。如果fooint 类型,则含义很明确。如果foo 是某种浮点类型,0 将转换为相同的类型(如果该值恰好是负零或 NaN,则可能会导致一些细微差别)。而如果foo 是一个指针,0 被视为一个空指针常量; if (ptr) 等价于if (ptr != NULL)(假设NULL 的定义可见)。

对于 C++,规则的表述略有不同,但效果是一样的。 C++ if 语句中的条件转换为类型 bool(与 C 中不同,类型 bool 自早期历史以来就已内置到 C++ 中)。 C++ 标准将任何标量类型的值转换为bool 定义为:

零值、空指针值或空成员指针值是 转换为 false;任何其他值都将转换为 true。一种 std::nullptr_t 类型的纯右值可以转换为 输入 bool;结果值为 false

所以在 C 和 C++ 中,任何标量(即整数、浮点或指针)值都可以用作条件,如果标量等于 0,则条件为假,否则为真等于零。 C 将此定义为与0 的不等式比较; C++ 将其定义为对bool 的转换——但结果是一样的。

这有点偏离问题的主题,但我会提到重要的是要注意被视为真实条件的值不一定等于true . true(如果您有 #include &lt;stdbool.h&gt;,则在 C 中为 1,并且在 C++ 中为 bool 类型的唯一值)只是在条件中使用时具有“真实性”的众多值之一。这就是为什么你几乎不应该写的原因:

if (cond == true) ...

在 C 或 C++ 中(除非你真的需要将它与那个值进行比较);随便写:

if (cond) ...

一个 C++ 示例:

#include <iostream>
int main() 
    int n = 2;
    if (n)         std::cout << "n has truthiness\n";
    else           std::cout << "n does not have truthiness\n";
    if (n == true) std::cout << "n == true\n";
    else           std::cout << "n != true\n";

输出是:

n has truthiness
n != true

【讨论】:

【参考方案4】:

任何不是0 的值都将转换为true在 C 的情况下为 1zero 值将转换为 false(0 in C 的情况)。关于C,如果我们查看C99 draft standard 部分6.3.1.2 布尔类型 段落1 说:

当任何标量值转换为 _Bool 时,如果值比较相等,则结果为 0 为 0;否则,结果为 1。

为了完整起见,如果我们查看 7.16 部分 布尔类型和值 段落 2 说:

The macro 

 bool

expands to _Bool.

关于 C++ draft C++ standard 部分 4.12 布尔转换 段落 1 说(强调我的 em>):

算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。 将零值、空指针值或空成员指针值转换为false;任何其他值都将转换为 true。[...]

无论您使用哪种编译器,这都应该成立。

【讨论】:

【参考方案5】:

好问题。答案是“取决于”。

if (-1)  // this is always true

另一方面,假设您使用的是 16 位机器:

if (-65536)  // this is always false

另一方面,

int a = whatever doesn't matter;
if (a < 0)  // this might or might not be true
    if (a)  // this will always be true if we get here
    

所以负数并不总是假的,但有时它们总是假的。

【讨论】:

在标准 C(至少 99 或 11)中,LONG_MIN 必须小于或等于 -2147483647,并且十进制整数常量被赋予第一类 intlong int、@ 987654326@可以代表数字。因此,-65536 将是 intlong int,在任何情况下都是负数。所以不管机器的位数如何,if (-65536) do_it(); 总是do_it()。如果您将-65536(或者,就此而言,65536)分配给uint16_t a,那么if (a) do_it(); 可能不会do_it(),但a 可能不会是负数(尽管是UB)。 在 16 位微控制器上,int 和 long int 可能都是 16 位,在这种情况下 -65536 将存储为文字零,可能带有编译器警告,但它仍然为零。 @danielV:如果 long int 是 16 位,那么你所拥有的不是一个兼容的 C 编译器,如果 C 编译器不兼容,那么它可能会做任何事情,但它不再是 C。兼容的编译器必须提供软件 32 位算法。这并不难。 gcc 在只有 32 位 ALU 的机器上实现 64 位算术。标准对long的最小尺寸非常明确。 @DanielV 根据标准 long 必须至少为 32 位

以上是关于amp在c语言中需要提前定义吗的主要内容,如果未能解决你的问题,请参考以下文章

C语言中在一个函数中可以声明另一个函数吗(不是定义)?在main里面声明也可以吗?

C语言 递归程序 求解

C语言中不能在函数里面声明函数吗

c语言中有bool类型吗?

object _c 语言可以在函数中再定义函数吗

编程中系统允许对库函数重新定义吗?