“if”中的变量声明表达追踪

发布于 2024-12-11 09:14:37 字数 514 浏览 1 评论 0原文

这是 C++,'if' 表达式中的变量声明规则的后续内容

if( int x = 3 && true && 12 > 11 )
    x = 1;

(据我所知)是:

  1. 每个表达式只能声明 1 个变量
  2. 变量声明必须首先出现在表达式中
  3. 必须使用复制初始化语法 直接初始化语法
  4. 不能有声明 1 周围的括号

和2 根据这个答案有意义,但我不能看看 3 和 4 有什么理由吗?还有其他人吗?

This is a follow-up to C++, variable declaration in 'if' expression

if( int x = 3 && true && 12 > 11 )
    x = 1;

The rules (so far as I can tell) are:

  1. can only have 1 variable declared per expression
  2. variable declaration must occur first in the expression
  3. must use copy initialization syntax not direct initialization syntax
  4. cannot have parenthesis around declaration

1 and 2 make sense according to this answer but I can't see any reason for 3 and 4. Can anyone else?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风透绣罗衣 2024-12-18 09:14:37

C++03 标准将选择语句定义为:

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condituion ) statement
condition:
    expression
    type-specifier-seq attribute-specifieropt declarator = initializer-clause

C++11 还添加了以下规则:

condition:
    type-specifier-seq attribute-specifieropt declarator braced-init-list

一般来说,这意味着您可能放在条件中的声明实际上只不过是保留命名的条件表达式的值以供进一步使用,即对于以下代码:

if (int x = 3 && true && 12 > 11) {
    // x == 1 here...

x 计算为:3 &&真&& (12>11)

回到您的问题:

3) C++11 现在允许您在这种情况下使用直接初始化(带大括号初始化程序),例如:

if (int x { 3 && true && 12 > 11 }) {

4) 以下内容: if ((int x = 1) && true ) 根据上面的定义没有意义,因为它不符合条件的“表达式或声明”规则。

C++03 standard defines selection statement as:

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condituion ) statement
condition:
    expression
    type-specifier-seq attribute-specifieropt declarator = initializer-clause

C++11 additionally adds the following rule:

condition:
    type-specifier-seq attribute-specifieropt declarator braced-init-list

Generally it means that the declaration you might put inside the condition is in fact nothing more than keeping the value of the condition expression named for further use, i.e. for the following code:

if (int x = 3 && true && 12 > 11) {
    // x == 1 here...

x is evaluated as: 3 && true && (12 > 11).

Back to your questions:

3) C++11 allows you now to use direct initialization (with brace initializer) in such case, e.g:

if (int x { 3 && true && 12 > 11 }) {

4) The following: if ((int x = 1) && true) does not make sense according to the definition above as it does not fit the: "either expression or declaration" rule for the condition.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文